我在故事板中有一个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)
答案 0 :(得分:2)
错误消息表明您正在呈现的视图控制器尚未(仍)在视图控制器层次结构中。也许您已经实例化了self
引用的视图控制器,并且尚未将其添加到标签栏的视图控制器集合中。也许您正试图在prepareForSegue
中执行此操作。也许您为子视图控制器执行了addSubview
但忽略了执行必要的视图控制器包含调用(例如addChildViewController
)。这可能是很多问题。在我们担心如何呈现其他视图控制器之前,我建议您先描述一下self
本身的呈现方式。
如果您认为self
已经在视图控制器层次结构中,我建议我们确认一下。从Xcode运行应用程序,在您点击显示VC
的这行代码之前,按调试器的暂停按钮:
在(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
是哪个。