Xcode-7.0.1:不鼓励在分离的视图控制器上显示视图控制器

时间:2015-10-16 13:20:11

标签: ios objective-c xcode xcode7

我在故事板中有一个UITabBarController,它有一个导航控制器作为标签栏项目之一。当我尝试在导航控制器的根视图控制器上执行[self presentViewController:myVC animated:YES completion:NULL]时,应用程序停止响应,我在控制台上收到以下错误/警告

2015-10-16 18:21:40.175 My_App[1224:488753] Presenting view controllers on detached view controllers is discouraged <MyViewController: 0x16512b00>.

只有当应用程序是使用Xcode-7.0.1构建并在iOS-9上运行时,才会遇到此问题。它使用Xcode-7.0.1在iOS-8上完美运行,在使用Xcode 6.4构建时甚至在iOS-9上运行。

修改

这是我在myVC之前提出myRootViewController之前的视图控制器层次结构。

(lldb) po [UIViewController _printHierarchy]
<LibraryTabBarController 0x7f91935e9660>, state: appeared, view: <UILayoutContainerView 0x7f9195841420>
   | <UINavigationController 0x7fe46b863200>, state: appeared, view: <UILayoutContainerView 0x7fe46b54c6a0>
   |    | <MyRootViewController 0x7fe46b47aa40>, state: appeared, view: <UIView 0x7fe46b66f8a0>
   | <MyOtherViewController 0x7f919580fd80>, state: disappeared, view:  (view not loaded)

1 个答案:

答案 0 :(得分:2)

错误消息表明您正在呈现的视图控制器尚未(仍)在视图控制器层次结构中。也许您已经实例化了self引用的视图控制器,并且尚未将其添加到标签栏的视图控制器集合中。也许您正试图在prepareForSegue中执行此操作。也许您为子视图控制器执行了addSubview但忽略了执行必要的视图控制器包含调用(例如addChildViewController)。这可能是很多问题。在我们担心如何呈现其他视图控制器之前,我建议您先描述一下self本身的呈现方式。

如果您认为self已经在视图控制器层次结构中,我建议我们确认一下。从Xcode运行应用程序,在您点击显示VC的这行代码之前,按调试器的暂停按钮:

enter image description here

(lldb)提示符处输入:

po [UIViewController _printHierarchy]

或者,如果你在Swift框架中暂停,你可以输入:

expr -l objc++ -O -- [UIViewController _printHierarchy]

你应该看到类似的东西:

(lldb) po [UIViewController _printHierarchy]
<UITabBarController 0x7fcae1c19740>, state: appeared, view: <UILayoutContainerView 0x7fcae1c26730>
   | <UINavigationController 0x7fcae3012c00>, state: appeared, view: <UILayoutContainerView 0x7fcae1d10b90>
   |    | <MyApp.ViewController 0x7fcae1c19cd0>, state: appeared, view: <UIView 0x7fcae1c2c470>
   | <SecondViewController 0x7fcae1e1b860>, state: disappeared, view:  (view not loaded)

确认您的问题中引用的任何视图控制器self出现在此视图控制器层次结构中。如果是这样,请向我们展示您的视图控制器层次结构以及self是哪个。