Wie stelle ich das programmgesteuert InitialViewController
für ein Storyboard ein? Ich möchte mein Storyboard in einer anderen Ansicht öffnen, abhängig von einer Bedingung, die von Start zu Start variieren kann.
252
Wie stelle ich das programmgesteuert InitialViewController
für ein Storyboard ein? Ich möchte mein Storyboard in einer anderen Ansicht öffnen, abhängig von einer Bedingung, die von Start zu Start variieren kann.
Antworten:
Wie ohne einen Dummy-Erstansichts-Controller
Stellen Sie sicher, dass alle Controller für die Erstansicht eine Storyboard-ID haben.
Deaktivieren Sie im Storyboard das Attribut "Ist der anfängliche Ansichts-Controller" im ersten Ansichts-Controller.
Wenn Sie Ihre App zu diesem Zeitpunkt ausführen, lesen Sie:
Und Sie werden feststellen, dass Ihre Fenstereigenschaft im App-Delegaten jetzt Null ist.
Wechseln Sie in der App-Einstellung zu Ihrem Ziel und zur
Info
Registerkarte. Dort löschen Sie den Wert vonMain storyboard file base name
.General
Löschen Sie auf der Registerkarte den Wert fürMain Interface
. Dadurch wird die Warnung entfernt.Erstellen Sie das Fenster und den gewünschten Controller für die Erstansicht in der
application:didFinishLaunchingWithOptions:
Methode des App-Delegaten :quelle
didFinishLaunchingWithOptions
wird aufgerufen, wenn die App in einem neuen Prozess gestartet wird. Wenn Sie zum Startbildschirm wechseln und zur App zurückkehren, wird diese Methode nicht erneut aufgerufen. (Es sei denn, iOS wird aufgrund von Speicherbeschränkungen beendet.) Stoppen Sie die App und starten Sie sie erneut über Ihre IDE. Wenn das Problem weiterhin besteht, senden Sie das Problem an SO und ich helfe Ihnen gerne weiter, Freund.self.window = UIWindow(frame: UIScreen.mainScreen().bounds) var storyboard = UIStoryboard(name: "Main", bundle: nil) var viewController: UIViewController = // self.window!.rootViewController = viewController self.window!.makeKeyAndVisible()
Für alle Swift- Liebhaber gibt es hier die Antwort von @Travis, übersetzt in SWIFT :
Tun Sie, was @Travis vor dem Objective C-Code erklärt hat. Dann,
Dies
ExampleViewController
wäre der neue anfängliche Ansichts-Controller, den Sie anzeigen möchten.Die Schritte erklärt:
Viel Spaß beim Programmieren!
quelle
Sie können den rootViewController des Schlüsselfensters programmgesteuert festlegen
(BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions
beispielsweise:
quelle
init()
/deinit()
-Zyklus durchläuft , ohne jedoch -s auszuführenviewDidLoad()
oder ordnungsgemäß zu initialisierenIBOutlet
. Stellen Sie sicher, dass Ihr Code dafür bereit ist.Swift 3: Update auf den Code von @ victor-sigler
quelle
Sie können den Rootviewcontroller für die Navigation als Hauptansichtscontroller festlegen. Diese Idee kann für die automatische Anmeldung gemäß den Anwendungsanforderungen verwendet werden.
Für StoryboardSegue-Benutzer
Vielen Dank
quelle
Öffnen Sie das Mainstoryboard, wählen Sie zuerst die Ansicht aus, die Sie starten möchten, und öffnen Sie dann Dienstprogramme -> Attribute. Unter dem "View Controller" sehen Sie das Optionsfeld "Ist der anfängliche View Controller". Wählen Sie es einfach aus.
--- Zur überarbeiteten Frage:
Möglicherweise können Sie Folgendes versuchen: Schreiben Sie eine Methode in den Abschnitt ViewDidLoad Ihrer ersten Ansicht, und wenn die Methode beim Start der Anwendung ausgeführt wird, löst die Methode einen Übergang zu einer anderen Ansicht aus.
quelle
SWIFT 5
Wenn Sie keinen ViewController als anfänglichen ViewController im Storyboard festgelegt haben, müssen Sie zwei Dinge tun:
Schließlich können Sie jetzt Ihren Code in SceneDelegate hinzufügen:
quelle
Failed to instantiate the default view controller for UIMainStoryboardFile 'Main' - perhaps the designated entry point is not set
Warnung behoben, die ich hatte, nachdem ich beschlossen hatte, meine anfängliche VC im Code zu instanziieren. Ein wichtiger Punkt, wenn @ rs7 "Löschen des Storyboard-Namensfelds" sagt, bedeutet dies die gesamte Zeile der Liste, nicht nur den Inhalt des Felds selbst.Ich denke nicht, dass es möglich ist. Stattdessen können Sie einen anfänglichen Controller haben, der zu verschiedenen Ansichts-Controllern übergeht. Beim Start können Sie entscheiden, welcher Abschnitt programmgesteuert ausgeführt werden soll.
quelle
Sie können sowohl
initial view controller
mit dem Interface Builder als auch programmgesteuert festlegen .Nachfolgend finden Sie einen programmgesteuerten Ansatz.
Ziel c :
Swift:
quelle
Ich habe eine Routing-Klasse erstellt, um die dynamische Navigation zu handhaben und die AppDelegate-Klasse sauber zu halten. Ich hoffe, sie hilft auch anderen.
Und in Ihrem AppDelegate nennen Sie dies
quelle
Eine andere Lösung bei der Verwendung von Swift 3 und Swift 4 unter Vermeidung von Kraftauswurf ist diese
Und unten wird mit verwendet
UINavigationController
quelle
In
AppDelegate.swift
können Sie den folgenden Code hinzufügen:Natürlich müssen Sie Ihre Logik implementieren, basierend auf den Kriterien, für die Sie einen geeigneten Ansichts-Controller auswählen.
Vergessen Sie auch nicht, eine Identität hinzuzufügen (wählen Sie Storyboard -> Controller-Szene -> Identitätsinspektor anzeigen -> StorboardID zuweisen).
quelle
AKTUALISIERTE ANTWORT für iOS 13 und Szenendelegierter:
Stellen Sie sicher, dass Sie in Ihrer info.plist-Datei zu Anwendungsszenenmanifest -> Szenenkonfiguration -> Anwendungssitzungsrolle -> Element 0 gehen und dort auch den Verweis auf das Haupt-Storyboard löschen. Andernfalls erhalten Sie dieselbe Warnung, dass das Storyboard nicht instanziiert werden kann.
Verschieben Sie außerdem den Code vom App-Delegaten in die Szenendelegat-Methodenszene (_: willConnectTo: options :), da hier jetzt Lebenszyklusereignisse behandelt werden.
quelle
Vor ein paar Tagen bin ich auf die gleiche Situation gestoßen. Ein sehr einfacher Trick löste dieses Problem. Ich habe meinen anfänglichen Ansichts-Controller vor dem Start ausgeblendet2. Wenn der anfängliche View-Controller der richtige Controller ist, wird er in viewDidLoad auf sichtbar gesetzt. Andernfalls wird ein Übergang zum gewünschten Ansichtscontroller durchgeführt. Es funktioniert perfekt in iOS 6.1 und höher. Ich bin sicher, dass es auf früheren Versionen von iOS funktioniert.
quelle
Dank dies wurde in AppDelegate wie folgt geändert:
quelle
Einfache Lösung gefunden - Sie müssen die "Überprüfung des anfänglichen Ansichtscontrollers" nicht aus dem Storyboard entfernen und die Registerkarte "Projektinformationen" bearbeiten und verwenden
makeKeyAndVisible
, sondern nur platzierenim
quelle
rootVC
voninstantiateViewControllerWithIdentifier
, richtig?Eine andere Möglichkeit besteht darin, viewController zu präsentieren.
Zuerst müssen Sie ein Objekt Ihres Storyboards erstellen und dann das Stammverzeichnis ändern (falls erforderlich). Dann verweisen Sie auf einen bestimmten Ansichts-Controller, der auf den aktuellen Ansichts-Controller verschoben wird (wenn Sie das Stammverzeichnis ändern). Andernfalls wird nur ein neuer Ansichts-Controller angezeigt, den Sie möglicherweise verwenden
quelle
Swift 4, Xcode 9
in der Datei AppDelegate.swift
quelle
quelle
Swift 5 oder höher # machen den Routenansichts-Controller mit diesem einfachen Code. Wenn Sie xcode 11 oder höher verwenden, initialisieren
var window: UIWindow?
Sie zuerst in AppDelegatequelle
Wenn Sie applicationDidFinish nicht ändern möchten, können Sie den folgenden Trick ausführen:
Legen Sie den Navigationscontroller als anfänglichen Ansichtscontroller fest und weisen Sie ihm eine benutzerdefinierte Klasse 'MyNavigationController' zu. Anschließend können Sie den Root-View-Controller während viewDidLoad optimieren. Dadurch wird der Root-View-Controller überschrieben, den Sie in Ihrem Storyboard festgelegt haben.
quelle
Wählen Sie den Ansichtscontroller aus, den Sie zuerst öffnen möchten, und wechseln Sie zum Attributinspektor. Gehen Sie zur ersten Szene und überprüfen Sie, ob die Option für die anfängliche Ansichtssteuerung aktiviert ist.
Dies ist nun Ihr erster Ansichts-Controller, der beim Start der Anwendung zuerst geöffnet wird.
quelle