Ich möchte den anfänglichen Viewcontroller über das Appdelegate einstellen. Ich habe eine wirklich gute Antwort gefunden, aber es ist in Ziel C und ich habe Probleme, das Gleiche schnell zu erreichen.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds];
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *viewController = // determine the initial view controller here and instantiate it with [storyboard instantiateViewControllerWithIdentifier:<storyboard id>];
self.window.rootViewController = viewController;
[self.window makeKeyAndVisible];
return YES;
}
Kann jemand helfen?
Ich möchte, dass der anfängliche Viewcontroller von bestimmten Bedingungen abhängig ist, die mithilfe einer bedingten Anweisung erfüllt werden.
Antworten:
Ich habe diesen Thread verwendet, um das Ziel C in schnell umzuwandeln, und es funktioniert perfekt.
Instanziieren und Präsentieren eines viewControllers in Swift
Swift 2 Code:
Swift 3 Code:
quelle
UIWindow
und seinen Stammansichtscontroller programmgesteuert festzulegen.Versuche dies. Zum Beispiel: Sie sollten
UINavigationController
als Controller für die Erstansicht verwenden. Anschließend können Sie einen beliebigen Ansichts-Controller als Root im Storyboard festlegen.Siehe meinen Storyboard-Bildschirm.
quelle
Für Swift 3, Swift 4:
Instanziieren Sie den Root View Controller über das Storyboard:
Wenn Sie
UINavigationController
als root verwenden möchten :Instanziieren Sie den Root View Controller von xib aus:
Es ist fast das gleiche, aber anstelle von Linien
du musst schreiben
quelle
Wenn Sie kein Storyboard verwenden, können Sie dies versuchen
quelle
Für den neuen Xcode 11.xxx und Swift 5.xx, wo das Ziel auf iOS 13+ festgelegt wurde.
Für die neue Projektstruktur muss AppDelegate nichts in Bezug auf rootViewController tun.
Eine neue Klasse dient zur Behandlung der Fensterklasse (UIWindowScene) -> 'SceneDelegate'-Datei.
quelle
Hier ist ein guter Weg, um es anzugehen. In diesem Beispiel wird ein Navigationscontroller als Root-View-Controller platziert und der View-Controller Ihrer Wahl am unteren Rand des Navigationsstapels platziert, damit Sie alles, was Sie benötigen, von ihm entfernen können.
Damit dieses Beispiel funktioniert, legen Sie "MainViewController" als Storyboard-ID auf Ihrem Hauptansichts-Controller fest. In diesem Fall lautet der Dateiname des Storyboards "MainStoryboard.storyboard". Ich benenne meine Storyboards auf diese Weise um, weil Main.storyboard für mich kein richtiger Name ist, insbesondere wenn Sie jemals in eine Unterklasse gehen.
quelle
Ich hatte es auf Ziel-C getan, hoffe, es wird nützlich für dich sein
quelle
Code für Swift 4.2 und 5 Code:
Und für
Xcode 11+
and for Swift 5+
:quelle
var window: UIWindow?
.And for Xcode 11+ and for Swift 5+
Teil hilft mir sehr. danke MannIch hatte in Xcode 8 und Swift 3.0 getan, hoffe, es wird nützlich für Sie sein, und es funktioniert perfekt. Verwenden Sie folgenden Code:
Und wenn Sie den Navigationscontroller verwenden, verwenden Sie dafür den folgenden Code:
quelle
Swift 4:
Fügen Sie diese Zeilen in AppDelegate.swift und in der Funktion didFinishLaunchingWithOptions () hinzu ...
Jetzt machen wir zum Beispiel oft so etwas, wenn wir den Benutzer entweder zu einem Anmeldebildschirm oder zu einem anfänglichen Einrichtungsbildschirm oder zurück zum Hauptbildschirm der App usw. führen möchten. Wenn Sie auch so etwas tun möchten können Sie diesen Punkt als Weggabelung dafür verwenden.
Denk darüber nach. Sie könnten beispielsweise einen Wert in NSUserDefaults speichern lassen, der einen userLoggedIn Boolean und enthält
if userLoggedIn == false { use this storyboard & initialViewController... } else { use this storyboard & initialViewController... }
quelle
Nun, alle Antworten oben / unten erzeugen eine Warnung vor keinem Einstiegspunkt im Storyboard.
Wenn Sie zwei (oder mehr) Controller für die Eingabeansicht haben möchten, die von einer bestimmten Bedingung abhängen (z. B. conditionVariable ), sollten Sie Folgendes tun:
Verwenden Sie den nächsten Code:
Hoffe das hilft.
quelle
Wenn Sie das Storyboard nicht verwenden. Sie können Ihren Hauptansichts-Controller programmgesteuert initialisieren.
Swift 4
Und auch
Main
aus den Bereitstellungsinformationen entfernen .quelle
Hier ist die vollständige Lösung in Swift 4, die in didFinishLaunchingWithOptions implementiert wird
Schreiben Sie diese Funktion an eine beliebige Stelle in Appdelegate.swift
quelle
Nur für den Fall, dass Sie dies im Ansichts-Controller und nicht im App-Delegaten tun möchten: Rufen Sie einfach den Verweis auf das AppDelegate in Ihrem Ansichts-Controller ab und setzen Sie das Fensterobjekt mit dem richtigen Ansichts-Controller als rootviewController zurück.
quelle
Für schnelles 4.0 .
Geben Sie in Ihre AppDelegate.swift- Datei in der Methode didfinishedlaunchingWithOptions den folgenden Code ein.
Hoffe es wird gut funktionieren.
quelle
Swift 5 & Xcode 11
In xCode 11 ist die Fensterlösung in appDelegate nicht mehr gültig. Sie haben dies in das SceneDelgate verschoben. Sie finden dies in der Datei SceneDelgate.swift.
Sie werden feststellen, dass es jetzt ein
var window: UIWindow?
Geschenk hat.In meiner Situation verwendete ich einen TabBarController aus einem Storyboard und wollte ihn als rootViewController festlegen.
Das ist mein Code:
sceneDelegate.swift
Stellen Sie sicher, dass Sie dies der richtigen Szenenmethode hinzufügen, wie ich es hier getan habe. Beachten Sie, dass Sie den Bezeichnernamen für den tabBarController oder viewController festlegen müssen, den Sie im Storyboard verwenden.
In meinem Fall habe ich dies getan, um einen stateController festzulegen, der gemeinsam genutzte Variablen in den Registerkartenansichten verfolgt. Wenn Sie dasselbe tun möchten, fügen Sie den folgenden Code hinzu ...
StateController.swift
Hinweis: Verwenden Sie stattdessen einfach Ihre eigenen Variablen oder was auch immer Sie verfolgen möchten. Ich habe meine nur als Beispiel in der Struktur tdfvariables aufgeführt.
Fügen Sie in jeder Ansicht des TabControllers die folgende Mitgliedsvariable hinzu.
Fügen Sie dann in denselben Dateien Folgendes hinzu:
Auf diese Weise können Sie den Singleton-Ansatz zum Übergeben von Variablen zwischen den Ansichten vermeiden . Dies ermöglicht leicht das Abhängigkeitsinjektionsmodell, das auf lange Sicht viel besser ist als der Singleton-Ansatz.
quelle
Deaktivieren
Main.storyboard
Storyboard-ID hinzufügen
Swift 5 und Xcode 11
Erweitern
UIWindow
Von Xcode generierte Bearbeitung
SceneDelegate.swift
quelle
quelle
quelle
Öffnen Sie einen Viewcontroller mit dem SWRevealViewController From App-Delegaten.
quelle
Für Swift 5+
quelle