Ich habe ein Storyboard mit funktionierendem Login und Hauptansichts-Controller eingerichtet. Letzteres ist der View-Controller, zu dem der Benutzer navigiert, wenn die Anmeldung erfolgreich ist. Mein Ziel ist es, den Hauptansichts-Controller sofort anzuzeigen, wenn die Authentifizierung (im Schlüsselbund gespeichert) erfolgreich ist, und den Anmeldeansichts-Controller anzuzeigen, wenn die Authentifizierung fehlgeschlagen ist. Grundsätzlich möchte ich dies in meinem AppDelegate tun:
// url request & response work fine, assume success is a BOOL here
// that indicates whether login was successful or not
if (success) {
// 'push' main view controller
} else {
// 'push' login view controller
}
Ich kenne die Methode performSegueWithIdentifier: Diese Methode ist jedoch eine Instanzmethode von UIViewController und kann daher nicht in AppDelegate aufgerufen werden. Wie mache ich das mit meinem vorhandenen Storyboard?
BEARBEITEN:
Der anfängliche Ansichts-Controller des Storyboards ist jetzt ein Navigations-Controller, der mit nichts verbunden ist. Ich habe den Unterschied setRootViewController: verwendet, da MainIdentifier ein UITabBarController ist. Dann sehen meine Zeilen so aus:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
BOOL isLoggedIn = ...; // got from server response
NSString *segueId = isLoggedIn ? @"MainIdentifier" : @"LoginIdentifier";
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Storyboard" bundle:nil];
UIViewController *initViewController = [storyboard instantiateViewControllerWithIdentifier:segueId];
if (isLoggedIn) {
[self.window setRootViewController:initViewController];
} else {
[(UINavigationController *)self.window.rootViewController pushViewController:initViewController animated:NO];
}
return YES;
}
Vorschläge / Verbesserungen sind willkommen!
[[self window] makeKeyAndVisible]
Anwendung aufrufen: didFinishLaunchingWithOptions: Bevor Sie versuchen, die bedingten Segmente auszuführen. UIApplicationMain () soll makeKeyAndVisible melden, dies jedoch erst nach didFinish ... Optionen: Beendet. Weitere Informationen finden Sie in den Apple-Dokumenten unter "Koordinierungsbemühungen zwischen Ansichtscontrollern".Ich bin überrascht über einige der hier vorgeschlagenen Lösungen.
Es sind wirklich keine Dummy-Navigations-Controller in Ihrem Storyboard erforderlich, um Ansichten auszublenden und Segues auf viewDidAppear: oder anderen Hacks auszulösen.
Wenn Sie das Storyboard nicht in Ihrer Plist-Datei konfiguriert haben, müssen Sie sowohl das Fenster als auch den Root-View-Controller selbst erstellen :
Wenn das Storyboard in der App-Liste konfiguriert ist , werden das Fenster und der Root-View-Controller bereits von der Zeitanwendung eingerichtet: didFinishLaunching: wird aufgerufen, und makeKeyAndVisible wird im Fenster für Sie aufgerufen.
In diesem Fall ist es noch einfacher:
quelle
WENN der Einstiegspunkt Ihres Storyboards kein
UINavigationController
:WENN der Einstiegspunkt Ihres Storyboards ein
UINavigationController
Ersatz ist:mit:
quelle
appHasLaunchedOnce ? secondViewControllerIdentifier : firstViewControllerIdentifier;
Fügen Sie in der AppDelegate-
application:didFinishLaunchingWithOptions
Methode vor derreturn YES
Zeile Folgendes hinzu:Ersetzen Sie
YourStartingViewController
durch den Namen Ihrer tatsächlichen First-View-Controller-Klasse (diejenige, die nicht unbedingt angezeigt werden soll) undYourSegueIdentifier
durch den tatsächlichen Namen des Segues zwischen diesem Start-Controller und dem Namen, mit dem Sie tatsächlich beginnen möchten (den nach dem Segue) ).Schließen Sie diesen Code in eine
if
Bedingung ein , wenn Sie nicht immer möchten, dass dies geschieht.quelle
Da Sie bereits ein Storyboard verwenden, können Sie dem Benutzer MyViewController, einen benutzerdefinierten Controller, präsentieren ( die Antwort von followben wird etwas heruntergekocht ).
In AppDelegate.m :
Die an instantiateViewControllerWithIdentifier übergebene Zeichenfolge bezieht sich auf die Storyboard-ID, die im Interface Builder festgelegt werden kann:
Wickeln Sie dies einfach nach Bedarf in Logik ein.
Wenn Sie jedoch mit einem UINavigationController beginnen, erhalten Sie mit diesem Ansatz keine Navigationssteuerung.
Verwenden Sie diesen Ansatz, um vom Startpunkt eines Navigationscontrollers, der über den Interface Builder eingerichtet wurde, vorwärts zu springen:
quelle
Lassen Sie den zuerst angezeigten Anmeldebildschirm überprüfen, ob der Benutzer bereits angemeldet ist, und drücken Sie sofort den nächsten Bildschirm. Alles in ViewDidLoad.
quelle
Schnelle Implementierung derselben:
Wenn du benutzt
UINavigationController
als Einstiegspunkt im Storyboard verwendenquelle
Dies ist die Lösung, die unter iOS7 funktioniert hat. Um das anfängliche Laden zu beschleunigen und kein unnötiges Laden durchzuführen, habe ich einen vollständig leeren UIViewcontroller namens "DUMMY" in meiner Storyboard-Datei. Dann kann ich folgenden Code verwenden:
quelle
Ich schlage vor, einen neuen MainViewController zu erstellen, der Root View Controller von Navigation Controller ist. Halten Sie dazu einfach die Steuerung gedrückt und ziehen Sie die Verbindung zwischen Navigation Controller und MainViewController. Wählen Sie an der Eingabeaufforderung "Beziehung - Root View Controller".
In MainViewController:
Denken Sie daran, Segues zwischen MainViewController mit Home- und Login-View-Controllern zu erstellen. Hoffe das hilft. :) :)
quelle
Nachdem ich viele verschiedene Methoden ausprobiert hatte, konnte ich dieses Problem folgendermaßen lösen:
quelle