背景
有时候,我们想在根控制器里面present一个新的控制器,或者遇到这么一个需求:程序启动,把主页(UITabbarController)设为根控制器,判断是否免登陆,没有免登陆的情况下弹出登录界面。一般来说,都是在跟控制器present一个登陆界面控制器出来,登陆成功就dismiss掉就好了。这里面,你坑定会掉到坑里面去,因为你可能会遇到:Warning: Attempt to present on whose view is not in the window hierarchy!这种警告。
警告分析:
为什么Xcode
会报这样的错误呢?
因为我们当前的控制器的view
视图还没有创建好,你就去present
一个新的新的控制器。就会报这样的警告错误。
解决办法:
- 把要present的控制器设置为根控制器。
[UIApplication sharedApplication].delegate.window.rootViewController = 新的控制器;
但是,不建议用这种方法。现在又把根控制器改变了,那之前那个控制器怎么办?建议当前控制器,用完就能消失掉最好。类似我说的,present
一个控制器,就要dismiss
掉这个控制器,回到原来的控制器。
还是要看个人怎么设计控制器之间的连接吧。
- 你要
present
一个控制器,必须要在当前控制器的视图加载完成之后才能present
。当然是在viewDidload
之后啦,可以再viewWillApear
,或者viewDidApear
里面作判断什么时候present
。程序启动流程不清楚的,看看这个UIViewController的生命周期。
会报错,多半是在didFinishLaunchingWithOptions
或者在viewDidload
里面就present
了。