Im Allgemeinen sollte das System die Instanziierung des View Controllers mit einem Storyboard verarbeiten. Sie möchten die viewController-Hierarchie durchlaufen, indem Sie einen Verweis auf die self.window.rootViewController
View Controller im Gegensatz zur Initialisierung von View Controllern abrufen , die bereits korrekt initialisiert werden sollten, wenn Sie Ihr Storyboard ordnungsgemäß eingerichtet haben.
rootViewController
Nehmen wir also an, Sie sind ein UINavigationController und möchten dann etwas an den Top View Controller senden. Sie würden dies in Ihrem AppDelegate folgendermaßen tun didFinishLaunchingWithOptions
:
UINavigationController *nav = (UINavigationController *) self.window.rootViewController;
MyViewController *myVC = (MyViewController *)nav.topViewController;
myVC.data = self.data;
In Swift wäre es sehr ähnlich:
let nav = self.window.rootViewController as! UINavigationController;
let myVC = nav.topViewController as! MyViewController
myVc.data = self.data
Sie sollten View Controller wirklich nicht mit Storyboard-IDs des App-Delegaten initialisieren, es sei denn, Sie möchten die normale Art des Ladens des Storyboards umgehen und das gesamte Storyboard selbst laden. Wenn Sie Szenen aus dem AppDelegate initialisieren müssen, machen Sie höchstwahrscheinlich etwas falsch. Ich meine, stellen Sie sich vor, Sie möchten aus irgendeinem Grund Daten an einen View-Controller weiter unten im Stapel senden. Das AppDelegate sollte nicht weit in den View-Controller-Stack hineinreichen, um Daten festzulegen. Das geht ihn nichts an. Das Geschäft ist der rootViewController. Lassen Sie den rootViewController seine eigenen Kinder behandeln! Wenn ich also den normalen Ladevorgang des Storyboards durch das System umgehen würde, indem ich Verweise darauf in der Datei info.plist entferne, würde ich den rootViewController höchstens mit instanziiereninstantiateViewControllerWithIdentifier:
und möglicherweise seine Wurzel, wenn es sich um einen Container wie einen UINavigationController handelt. Was Sie vermeiden möchten, ist das Instanziieren von View-Controllern, die bereits vom Storyboard instanziiert wurden. Das ist ein Problem, das ich sehr sehe. Kurz gesagt, ich bin mit der akzeptierten Antwort nicht einverstanden. Es ist falsch, es sei denn, die Poster bedeuten, das Laden des Storyboards aus der info.plist zu entfernen, da Sie ansonsten 2 Storyboards geladen haben, was keinen Sinn ergibt. Es ist wahrscheinlich kein Speicherverlust, da das System die Stammszene initialisiert und dem Fenster zugewiesen hat, aber dann sind Sie gekommen und haben sie erneut instanziiert und erneut zugewiesen. Ihre App hat einen ziemlich schlechten Start!