我在AppDelegate的LaunchViewController
方法中加载application:didFinishLaunching
作为根视图控制器:
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"LaunchViewController" bundle:nil];
LaunchViewController *launchViewController = [storyboard instantiateInitialViewController];
launchViewController.managedObjectContext = [CurrentSession mainQueueContext];
self.window.rootViewController = launchViewController;
[self.window makeKeyAndVisible];
LaunchViewController与Web服务器通信以获取一些数据。我正在使用AFNetworking库与Web服务器进行异步通信。在获取数据后的成功回调中,我呈现了LoginViewController。我的理解是AFNetworking的回调是在主线程上执行的。不过我只是用performSelectionOnMainThread
看看是否能解决问题:
内部回调:
[self performSelectorOnMainThread:@selector(presentLoginView) withObject:nil waitUntilDone:NO];
presentLoginView
方法:
- (void)presentLoginView {
LoginViewController *loginViewController = [[LoginViewController alloc] initWithNibName:@"LoginViewController" bundle:nil];
loginViewController.managedObjectContext = self.managedObjectContext;
[self presentViewController:loginViewController animated:YES completion:nil];
}
未显示登录视图,在控制台中我看到以下消息:
Warning: Attempt to present <LoginViewController: 0x78e47c30> on <LaunchViewController: 0x78eb4a60> whose view is not in the window hierarchy!
: - (
更新 我在LoginViewController的viewDidLoad,viewDidUnload,viewWillAppear和viewDidAppear方法中放置了一个断点。 viewDidLoad被点击了。其他人不是。 为什么视图会被加载但不会出现?
答案 0 :(得分:0)
这可能正在发生,因为AFNetworking非常快地执行回调,例如在加载视图控制器的视图之前,可能是因为您在viewDidLoad中使用本地服务器或其他配置很慢。在这种情况下,我建议将代码移动到viewWillAppear或viewDidAppear,因为在那一刻,视图将在层次结构中,因此您将能够从那里呈现另一个ViewController。
答案 1 :(得分:0)
在我的AFNetworking成功回调中,我将从Web服务器获得的一些信息设置为NSUserDefaults。然后我呈现了LoginViewController。
我的AppDelegate正在收听NSUserDefaultsDidChangeNotification
通知。此通知的处理程序将launchViewController设置为根视图控制器。
所以,在我要求LaunchViewController呈现LoginViewController的AFNetworking回调中,我还发送了NSUserDefaultsDidChangeNotification,这会导致AppDelegate加载LaunchViewController。
我从来没有看到过任何一个LoginViewController的闪烁。所以,我认为AppDelegate处理程序首先被触发,然后调用presentLoginViewController。这会以某种方式导致视图不被添加到窗口层次结构消息中。