2016-07-22 8 views
3

Mein Xcode-Debugger berichtet, alle anderen Werte enthalten lebendig (Bool-Wert) ist gesetzt, außer alle IBOutlets gefunden Null (myLine, etc.). By the way, alles funktioniert, wenn ich den gesamten Code in App Delegate löschen, aber ich brauche diese Ansicht häufig zu aktualisieren, also implementieren Sie es in ApplicationWillEnterForeground erforderlich ist. Und noch etwas, das es wert ist, darauf hinzuweisen, dass ich in den Konfigurationsansichten 1 und 2 den Wert jedes Auslasses einstelle. Und ich mache App Delegate Anruf viewdidload Methode davor, so dass alle Ausgänge sollten bereits mit Code verbunden, so dass diese Steckdosen sollten nicht Null sein.Warum alle IBOutlet (s) gefunden, wenn viewdidload in App Delegate aufgerufen wird?

An error message in the debugger -- fatal error: unexpectedly found nil while unwrapping an Optional value

import UIKit 

class ViewController: UIViewController { 

    var alive : Bool = true 
    var aliveDefault = NSUserDefaults.standardUserDefaults() 


    //IBOulet Connections 

    @IBOutlet weak var myLine: UILabel! 

    @IBAction func buttontapped(sender: AnyObject) { 
     alive = false 
     NSUserDefaults.standardUserDefaults().setObject(alive, forKey: "alive") 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 

     loadView() 
    } 
    func loadView(){ 
     alive = aliveDefault.boolForKey("alive") 
     if alive = true { 
      configureView() 
      }else{ 
      configureView2() 
     } 
    } 

    func configureView(){ 
     myLine.text = "Random text" 
    } 

    func configureView2(){ 
     myLine.text = "Random text 2" 
    } 
} 

App Delegierter

func applicationWillEnterForeground(application: UIApplication) { 
     // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. 
    ViewController().viewDidLoad() 
    ViewController().configureView() 
} 
+0

Warum rufen Sie 'viewDidLoad()' explizit auf? – triandicAnt

+0

diese Ausgänge werden immer noch Null sein, wenn ich nicht explizit ViewDidLoad() aufrufen, also versuche ich andersherum. – Joe

+0

Man soll 'viewDidLoad()' niemals explizit aufrufen: es wird einmal im Lebenszyklus des Controllers automatisch aufgerufen. Versuchen Sie stattdessen '_ = ViewController(). View;' eventuell (aber es wird davon abgeraten). –

Antwort

3

Da Sie zwei neue Instanzen ViewController in applicationWillEnterForeground Erstellen der Standard initialiser mit eher als aus dem Storyboard, keiner der IBOutlets gesetzt. Sie müssen die aktuelle Instanz des View-Controllers aktualisieren, der auf dem Bildschirm angezeigt wird.

Anstatt dies von der appDelegate zu tun, ist es wahrscheinlich einfacher, Ihre View-Controller abonnieren UIApplicationWillEnterForegroundNotificationNSNotification und behandeln die Aktualisierung lokal. Auf diese Weise brauchen Sie nicht eng Paar AppDelegate und Ihre View-Controller, und Sie brauchen sich keine Sorgen machen, wenn die View-Controller ist nicht auf dem Bildschirm ist:

class ViewController: UIViewController { 

    ... 

    override func viewWillAppear(animated: Bool) { 
     super.viewWillAppear(animated) 
     NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ViewController.loadView), name: UIApplicationWillEnterForegroundNotification, object: nil) 
    } 

    override func viewWillDisappear(animated: Bool) { 
     super.viewWillDisappear(animated) 
     NSNotificationCenter.defaultCenter().removeObserver(self) 
    } 
+0

Erstaunliche Antwort. Es ist eine gute Methode, wenn Sie zwei neue Instanzen haben. – Joe

0

Sie ViewController.loadViewIfNeeded() bevor Werte IBOutlets Zuordnung

Verwandte Themen