iOS警告:尝试呈现其视图不在窗口层次结构中的ViewController

时间:2015-03-11 19:42:44

标签: ios objective-c iphone cocoa-touch uiviewcontroller

我知道围绕这个警告有很多讨论,我们应该只在呈现视图控制器完全呈现并添加到视图层次结构中后呈现视图控制器。遵循所有这些规则,在呈现第二个模态视图控制器时,我仍然会收到此警告。

这里发生了一系列完整的行动:

  1. 在应用启动时,初始化并将基本视图控制器添加到窗口。
  2. 从基本视图控制器,点击按钮,模态显示第一个视图控制器。
  3. 从第一个视图控制器,点击按钮,模态显示第二个视图控制器。一旦被解雇,我需要显示第一个视图控制器,所以我不会解雇第一个VC,然后从基础VC中提出第二个VC。
  4. 控制台警告:

    2015-03-11 13:15:43.467 MyApp[597:84839] Warning: Attempt to present <MyCustomNavigationViewController: 0x15d6a8920> on <MyFirstModalViewController: 0x15d67cc60> whose view is not in the window hierarchy!
    

    思想?

    以下是我的代码[不显示按钮处理程序;从调用方法中获取代码]:

    // Present base view controller
    self.window.backgroundColor = [UIColor whiteColor];
    self.primaryViewController = [[MyParentViewController alloc] init];
    self.navigationController = [[MyCustomNavigationViewController alloc] initWithRootViewController:self.primaryViewController];
    [self.navigationController.navigationBar setBarStyle:UIBarStyleBlack];
    self.window.rootViewController = self.navigationController;
    [self.window makeKeyAndVisible];
    
    // Present first view controller modally from base view controller
    MyFirstModalViewController *firstModal = [[MyFirstModalViewController alloc] init];
    MyCustomNavigationViewController *aNavigationController = [[MyCustomNavigationViewController alloc] initWithRootViewController:firstModal];
    [aNavigationController.navigationBar setBarStyle:UIBarStyleBlack];
    [self presentViewController:aNavigationController animated:YES completion:nil];
    
    // Present second view controller modally from first view controller: On user tap on a button
    MySecondModalViewController *secondModal = [[MySecondModalViewController alloc] init];
    MyCustomNavigationViewController *aNavigationController = [[MyCustomNavigationViewController alloc] initWithRootViewController:secondModal];
    [aNavigationController.navigationBar setBarStyle:UIBarStyleBlack];
    [self presentViewController:aNavigationController animated:YES completion:nil];
    

1 个答案:

答案 0 :(得分:0)

如果您在问题中显示的代码与在app启动时运行的确切顺序相同,那是因为当第一个模态没有时,它正试图为第二个Modal viewcontroller(第三个实际的视图控制器)设置动画完成动画制作。

在这两行 - [self presentViewController:aNavigationController animated:YES completion:nil];设置动画:NO。这将使这些视图立即显示,并可能消除您所获得的错误。

如果您需要动画,并且您需要像所写的那样立即打开所有视图,那么您可能希望在调用第三个viewcontroller(第二个模态)之前实现延迟。

你说你是从按钮调用这些视图?代码另有说明。