Przez wiele godzin szukałem w Internecie i przepełnienia stosu i nie mogę rozwiązać tego problemu. Mam nadzieję, że wszyscy zobaczyliście mój błąd, ponieważ po prostu nie mogę go znaleźć.Ręczne przejście modalne nie działa, kontroler widoku nie znajduje się w hierarchii okna?
Mam prostą aplikację opartą na storyboardzie, którą właśnie zacząłem. Początkowy ViewController jest instancją UITabBarController z dwoma fałszywymi ViewControllerami z szablonu. Po uruchomieniu muszę sprawdzić, czy urządzenie jest zalogowane do usługi zewnętrznej. Jeśli nie, pokażę modalny ViewController, który pozwoli użytkownikowi uwierzytelnić, jeśli urządzenie jest uwierzytelnione, po prostu pokażę FirstViewController.
następujące kroki są wszystko zrobiłem od tworzenia projektu:
- utworzyć scenę AuthenticateViewController na Storyboard
- Tworzenie plików kodu dla AuthenticateViewController i przypisać je do odpowiedniej sceny
- Tworzenie pliki kodu dla podklasy UITabBarController i powiąż początkową scenę UITabBarController z nową podklasą
- Utwórz nową scenę w serii ujęć ze sceny UITabBarController do Authenti cateViewController scena
- ręcznie wywołać segue od
viewDidLoad
w podklasie UITabBarController
Kiedy uruchomić aplikację modalna segue nie ogień, jest pokazany pierwszy ViewController z UITabBarController i uzyskać następujący wynik w Xcode :
Warning: Attempt to present <AuthenticateViewController: 0x83c0c10> on <EPTabBarController: 0x83be600> whose view is not in the window hierarchy!
Odpowiedni kod poniżej, w rzeczywistości jedyny kod, który dodałem do tej pory. Daj mi znać, jeśli przydatne będą zrzuty ekranu lub dodatkowe informacje. Z góry dziękuje za twoją pomoc.
EPTabBarController, podklasa UITabBarController:
#import "EPTabBarController.h"
#import "AuthenticateViewController.h"
@interface EPTabBarController()
@end
@implementation EPTabBarController
- (void)viewDidLoad
{
[super viewDidLoad];
[self performSegueWithIdentifier:@"authenticationSegue" sender:self];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
To działa, ale wydaje mi się dość nieeleganckim rozwiązaniem. Czy to jedyny sposób, aby to osiągnąć? Czy wywołanie "performSegueWithIdentifer:" powinno być umieszczone gdzie indziej? – blundin
Hej @ Blundin, spróbuj ustawić afterDelay: 0.0 i sprawdź. daj mi znać, jeśli działa gładko. –
Tak, to działa sprawnie. Dziękuję Ci. – blundin