Ich habe zwei UIViewControllers.Ich versuche, eine Funktion von verschiedenen UIViewController über Protokoll aufzurufen, aber ich bin auf Delegieren null - was könnte hier der Fall sein?
Die erste einen Behälter enthält, die standardmäßig angezeigt wird, sieht die Klasse etwas wie folgt aus:
protocol HandleMapPopupBehavior {
func hideContainer()
}
class MapEvents: UIViewController, HandleMapPopupBehavior {
@IBOutlet weak var userDetails: UIView!
var userProfile: YourFullUser?
override func viewDidLoad() {
super.viewDidLoad()
userProfile = YourFullUser()
}
func hideContainer(){
userDetails.hidden = true
print("hiding container now")
}
}
Der zweite Anruf enthält, die die Funktion hideContainer()
in viewDidAppear()
aufrufen sollte:
class YourFullUser: UIViewController{
var delegate: HandleMapPopupBehavior?
override func viewDidAppear(animated: Bool) {
super.viewWillAppear(animated)
delegate!.hideContainer() //this line causes error
print("container should be hidden")
}
Aber jetzt, wenn ich diese Viewcontroller laufen ich erhalte Fehler:
fatal error: unexpectedly found nil while unwrapping an Optional value
Was könnte hier der Fall sein?
Sie nie etwas gesetzt delegieren. Deshalb ist es Null. Du hast dann hinzugefügt! was ein Auspacken eines Nullwerts erzwingt. – ryantxr
Fügen Sie die Zeile 'userProfile.delegate = self' hinzu und Sie sollten es beheben können. Es gibt keinen Grund, den Delegierten implizit auszupacken. Und verwenden Sie eine schwache Referenz zu Ihrem Delegaten, um einen Referenzzyklus zu verhindern. – Eendje
@Eendje Was genau meinen Sie mit einer schwachen Referenz? Könnten Sie es bitte als Antwort posten, damit ich es annehmen kann? :) – user3766930