2016-03-22 3 views
0

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?

+0

Sie nie etwas gesetzt delegieren. Deshalb ist es Null. Du hast dann hinzugefügt! was ein Auspacken eines Nullwerts erzwingt. – ryantxr

+0

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

+0

@Eendje Was genau meinen Sie mit einer schwachen Referenz? Könnten Sie es bitte als Antwort posten, damit ich es annehmen kann? :) – user3766930

Antwort

1

Sie Ihr Protokoll entsprechen class

protocol HandleMapPopupBehavior: class { 
    func hideContainer() 
} 

Wenn Sie YourFullUserself Delegierten zuweisen erstellen:

class MapEvents: UIViewController, HandleMapPopupBehavior { 

    var userProfile: YourFullUser? 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     userProfile = YourFullUser() 
     userProfile?.delegate = self 
    } 

    func hideContainer() { 
     print("hiding container now") 
    } 
} 

YourFullUser Klasse:

class YourFullUser: UIViewController { 

    weak var delegate: HandleMapPopupBehavior? 

    override func viewDidAppear(animated: Bool) { 
     super.viewDidAppear(animated) 

     delegate?.hideContainer() // Safely use the delegate 
    } 
} 
+0

Ich habe deine Lösung müde, aber es hat leider nicht funktioniert. Ich bekomme keinen Fehler, aber ich sehe auch nicht den Container, der jetzt versteckt. Ich habe diesen Block direkt vor dem 'delegate? .hideContainer()': 'if (delegate == nil) { Drucken (" Delegat ist leer ") }' und ich sehe diese Nachricht in meiner Konsole, so dass das Problem ist - Wie kann ich das Delegate-Objekt "füllen" (initialisieren)? – user3766930

+0

Haben Sie "userProfile? .delegate = self" hinzugefügt, wenn Sie 'YourFullUser()' erstellen? Denn ohne den Delegierten zuzuordnen, wird es offensichtlich "nil" sein. :) – Eendje

+0

ja ich tat :) Ich habe sogar versucht, es von 'viewDidLoad' nach' viewWillAppear' zu verschieben, aber das Ergebnis ist das gleiche :( – user3766930