Stellen Sie sich das folgende Szenario vor: Ich habe eine Storyboard-basierte App. Ich füge dem Storyboard ein ViewController-Objekt hinzu, füge die Klassendateien für diesen ViewController zum Projekt hinzu und gebe den Namen der neuen Klasse im IB-Identitätsinspektor an. Wie werde ich nun programmgesteuert aus dem AppDelegate auf diesen ViewController verweisen? Ich habe eine Variable mit der entsprechenden Klasse erstellt und in eine IBOutlet-Eigenschaft umgewandelt, sehe jedoch keine Möglichkeit, im Code auf den neuen ViewController zu verweisen. Jeder Versuch, eine Verbindung bei gedrückter Strg-Taste zu ziehen, funktioniert nicht .
dh innerhalb des AppDelegate kann ich so zum Basis-ViewController gelangen
(MyViewController*) self.window.rootViewController
Aber wie wäre es mit einem anderen ViewController im Storyboard?
quelle
Antworten:
Schauen Sie sich die Dokumentation für an
-[UIStoryboard instantiateViewControllerWithIdentifier:]
. Auf diese Weise können Sie einen Ansichtscontroller von Ihrem Storyboard aus mithilfe der im IB-Attributinspektor festgelegten Kennung instanziieren:BEARBEITET, um Beispielcode hinzuzufügen:
quelle
[[[self window] rootViewController] storyboard]
Gemäß den Dokumenten wird das "Storyboard zurückgegeben, von dem der View Controller stammt". (oder null, wenn es nicht aus einem Storyboard stammt). Von diesem UIStoryboard * aus können Sie die von @RobinSummerhill erwähnten Instanziierungsaufrufe verwenden. Beachten Sie, dass Storyboards neue Instanzen Ihrer viewController ( Szenen ) nach Bedarf instanziieren und die zuvor angezeigten nicht wiederverwenden.Wenn Sie
XCode
5 verwenden, sollten Sie dies anders machen.UIViewController
inUIStoryboard
Identity Inspector
rechten oberen BereichUse Storyboard ID
KontrollkästchenStoryboard ID
FeldDann schreiben Sie Ihren Code.
quelle
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 tundidFinishLaunchingWithOptions
:In Swift wäre es sehr ähnlich:
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 instanziieren
instantiateViewControllerWithIdentifier:
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!quelle
quelle