Mam scenorys skonfigurowany z działającym logowaniem i głównym kontrolerem widoku, ten ostatni jest kontrolerem widoku, do którego przechodzi użytkownik po pomyślnym zalogowaniu. Moim celem jest natychmiastowe pokazanie kontrolera widoku głównego, jeśli uwierzytelnianie (przechowywane w pęku kluczy) powiedzie się, i pokazanie kontrolera widoku logowania, jeśli uwierzytelnienie się nie powiodło. Zasadniczo chcę to zrobić w mojej AppDelegate:
// 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
}
Wiem o metodzie performSegueWithIdentifier: ale ta metoda jest metodą instancji UIViewController, więc nie można jej wywołać z poziomu AppDelegate. Jak to zrobić, korzystając z mojej istniejącej serii ujęć?
EDYTOWAĆ:
Początkowy kontroler widoku Storyboard jest teraz kontrolerem nawigacji, który nie jest z niczym połączony. Użyłem setRootViewController: rozróżnienie, ponieważ MainIdentifier to UITabBarController. A więc tak wyglądają moje linie:
- (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;
}
Sugestie / ulepszenia są mile widziane!
[[self window] makeKeyAndVisible]
w aplikacji: didFinishLaunchingWithOptions: zanim spróbujesz wykonać warunkowe sekwencje. UIApplicationMain () ma wysłać komunikat makeKeyAndVisible, ale robi to dopiero po didFinish ... Opcje: kończy. Aby uzyskać szczegółowe informacje, poszukaj pozycji „Koordynacja wysiłków między kontrolerami widoku” w dokumentach Apple.Jestem zaskoczony niektórymi proponowanymi tutaj rozwiązaniami.
Naprawdę nie ma potrzeby stosowania fałszywych kontrolerów nawigacyjnych w scenorysie, ukrywania widoków i wypalania fragmentów w widoku ViewDidAppear: ani żadnych innych hacków.
Jeśli nie masz scenorysu skonfigurowanego w pliku plist, musisz samodzielnie utworzyć zarówno okno, jak i główny kontroler widoku :
Jeśli scenorys jest skonfigurowany w pliku plist aplikacji, kontroler okna i widoku głównego zostanie już skonfigurowany przez aplikację czasu: didFinishLaunching: jest wywoływana, a makeKeyAndVisible zostanie wywołana w oknie za Ciebie.
W takim przypadku jest to jeszcze prostsze:
źródło
JEŚLI punktem wejścia twojego storyboardu nie jest
UINavigationController
:JEŻELI punkt wejścia w scenorysie JEST
UINavigationController
zamiennikiem:z:
źródło
appHasLaunchedOnce ? secondViewControllerIdentifier : firstViewControllerIdentifier;
W
application:didFinishLaunchingWithOptions
metodzie AppDelegate , przedreturn YES
wierszem, dodaj:Zastąp
YourStartingViewController
nazwą swojej aktualnej klasy kontrolera pierwszego widoku (tej, której niekoniecznie chcesz się pojawić) orazYourSegueIdentifier
rzeczywistą nazwą przejścia między tym kontrolerem początkowym a tym, na którym chcesz rozpocząć (ten po przejściu ).Zawiń ten kod w
if
warunek, jeśli nie zawsze chcesz, aby tak się stało.źródło
Biorąc pod uwagę, że używasz już Storyboard, możesz użyć tego, aby zaprezentować użytkownikowi MyViewController, niestandardowy kontroler ( podsumowanie odpowiedzi followbena ).
W AppDelegate.m :
Ciąg przekazany do instantiateViewControllerWithIdentifier odwołuje się do identyfikatora serii ujęć, który można ustawić w konstruktorze interfejsu:
W razie potrzeby po prostu zawiń to w logikę.
Jeśli jednak zaczynasz od UINavigationController, to podejście nie zapewni Ci elementów sterujących nawigacją.
Aby „przeskoczyć do przodu” od punktu początkowego kontrolera nawigacyjnego skonfigurowanego za pomocą narzędzia do tworzenia interfejsu, zastosuj następujące podejście:
źródło
Dlaczego nie wyświetlić ekranu logowania, który pojawia się jako pierwszy, sprawdzić, czy użytkownik jest już zalogowany i od razu przesunąć następny ekran? Wszystko w pliku ViewDidLoad.
źródło
Szybka realizacja tego samego:
Jeśli używasz
UINavigationController
jako punktu wejścia w scenorysieźródło
To rozwiązanie działało w iOS7. Aby przyspieszyć początkowe ładowanie i uniknąć niepotrzebnego ładowania, mam całkowicie pusty kontroler UIView o nazwie „DUMMY” w moim pliku Storyboard. Następnie mogę użyć następującego kodu:
źródło
Proponuję utworzyć nowy MainViewController, który jest głównym kontrolerem widoku kontrolera nawigacji. Aby to zrobić, po prostu przytrzymaj kontrolkę, a następnie przeciągnij połączenie między kontrolerem nawigacji a kontrolerem MainViewController, wybierz z monitu opcję `` Relacja - główny kontroler widoku ''.
W MainViewController:
Pamiętaj, aby utworzyć sekwencje między MainViewController z kontrolerami widoku Home i Login. Mam nadzieję że to pomoże. :)
źródło
Po wypróbowaniu wielu różnych metod udało mi się rozwiązać ten problem w ten sposób:
źródło