In generale, il sistema dovrebbe gestire la creazione di istanze del controller di visualizzazione con uno storyboard. Quello che vuoi è attraversare la gerarchia di viewController afferrando un riferimento al self.window.rootViewController
invece di inizializzare i controller di visualizzazione, che dovrebbero già essere inizializzati correttamente se hai impostato correttamente lo storyboard.
Quindi, diciamo che il tuo rootViewController
è un UINavigationController e quindi vuoi inviare qualcosa al suo controller di visualizzazione superiore, lo faresti in questo modo nel tuo AppDelegate didFinishLaunchingWithOptions
:
UINavigationController *nav = (UINavigationController *) self.window.rootViewController;
MyViewController *myVC = (MyViewController *)nav.topViewController;
myVC.data = self.data;
In Swift se sarebbe molto simile:
let nav = self.window.rootViewController as! UINavigationController;
let myVC = nav.topViewController as! MyViewController
myVc.data = self.data
Non dovresti davvero inizializzare i controller di visualizzazione utilizzando gli ID dello storyboard dal delegato dell'app a meno che tu non voglia aggirare il normale modo in cui lo storyboard viene caricato e caricare l'intero storyboard da solo. Se devi inizializzare scene da AppDelegate, molto probabilmente stai facendo qualcosa di sbagliato. Voglio dire, immagina che tu, per qualche motivo, desideri inviare dati a un controller di visualizzazione in fondo allo stack, AppDelegate non dovrebbe raggiungere lo stack del controller di visualizzazione per impostare i dati. Non sono affari suoi. Il suo business è rootViewController. Lascia che rootViewController gestisca i propri figli! Quindi, se ignorassi il normale processo di caricamento dello storyboard da parte del sistema rimuovendo i riferimenti ad esso nel file info.plist, al massimo istanzerei il rootViewController usandoinstantiateViewControllerWithIdentifier:
e possibilmente la sua radice se è un contenitore, come un UINavigationController. Quello che vuoi evitare è creare un'istanza dei controller di visualizzazione che sono già stati istanziati dallo storyboard. Questo è un problema che vedo spesso. In breve, non sono d'accordo con la risposta accettata. Non è corretto a meno che i poster non intendono rimuovere il caricamento dello storyboard da info.plist poiché altrimenti avresti caricato 2 storyboard, il che non ha senso. Probabilmente non è una perdita di memoria perché il sistema ha inizializzato la scena radice e l'ha assegnata alla finestra, ma poi sei arrivato tu e l'hai istanziata di nuovo e assegnata di nuovo. La tua app è iniziata piuttosto male!