2017-06-26 1 views
1

Ich erstelle eine Taschenrechner-App, in der ich eine Variable in einem separaten View-Controller von einer Einstellungsseite aus festlegen muss. Wenn Sie dieses Kunststück versuchen, passieren einige seltsame Dinge. Erstens gibt es irgendwie die Variable Null zurück. Dann initialisierte es einen neuen View-Controller. Alle nicht statischen Variablen sind jedoch identisch, wenn ich eine Instanz des alten Ansichtscontrollers erneut öffne.Verweis auf einen anderen UIViewController Verursacht einen Nullzeiger und erstellt ein neues Objekt

Es könnte ein Fehler in meinem Code sein:

func updateTag(title: String){ 
    switch(title){ 
    case "displayWithPrecisionSwitch": 
     let mainViewController = storyboard?.instantiateViewController(withIdentifier: "timerViewController") as! ViewController 
     mainViewController.updatePercision() 
     mainViewController.correctTallyDisplay?.refresh(totalTime: mainViewController.counter.getIntegerTime(), goal: mainViewController.counter.getGoal()) 
     mainViewController.incorrectTallyDisplay?.refresh(totalTime: mainViewController.counter.getIntegerTime(), goal: mainViewController.counter.getGoal()) 
     print(mainViewController.correctTallyDisplay?.percision ?? "Warning Nil") 
    default: 
     print("break") 
     break; 
    } 
} 

Oder in der Benutzeroberfläche: Geben Sie Bildbeschreibung hier enter image description here Ich brauche nur einen Weg zu finden, Funktionen aufzurufen von „timerViewController“.

Antwort

1

Ja, Sie initialisieren einen neuen View-Controller, wenn Sie storyboard?.instantiateViewController aufrufen und das sollten Sie nicht tun. Um einfach eine Methode in einem anderen View-Controller aufzurufen, können Sie NSNotificationCenter wie this verwenden oder ein delegate erstellen, um dasselbe Ergebnis zu erzielen. Der erste ist einfacher zu implementieren.

Hier ist ein Beispiel, wenn Sie nur eine Methode von einem anderen View-Controller aufrufen müssen. Nehmen wir an, Ihr Anrufer-View-Controller versucht, eine Methode in Ihrem aufgerufenen Controller aufzurufen.

Also in Ihrem Angerufenen Controller müssen Sie ablehnen, um diese Art von Anruf in Ihrer viewDidLoad Methode zu erhalten. Also diesen Code setzt sich um die Registrierung zu tun

NotificationCenter.default.addObserver(self, selector: #selector(methodOfReceivedNotification(notification:)), name: Notification.Name("NotificationIdentifier"), object: nil) 

Dann müssen Sie die Methode, die diese Benachrichtigung

func methodOfReceivedNotification(notification: Notification){ 
    //either replace the function name to your function or call your function here 
} 

Dann in Ihren Anrufer-View-Controller ruft die View-Controller oder einen anderen Ansicht-Controller setzen, Wenn Sie diese registrierte Methode aufrufen möchten, tun Sie einfach

NotificationCenter.default.post(name: Notification.Name("NotificationIdentifier"), object: nil) 
+0

Danke. Lass mich nachlesen. – macrocypher

+0

@Macrocypher Beantwortete meine Antwort mit einfachen Setups –

Verwandte Themen