presentViewController警告视图不在窗口层次结构中

时间:2015-03-20 18:57:10

标签: ios

我在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被点击了。其他人不是。 为什么视图会被加载但不会出现?

2 个答案:

答案 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。这会以某种方式导致视图不被添加到窗口层次结构消息中。