本人最近在重新做一个新项目,设置rootViewController时,发现[UIApplication sharedApplication].keyWindow为nil,
然后各种找原因, 大概原因就是在用[UIApplication sharedApplication].keyWindow获取keywindow的时候, keywindow并没有被创建, 需要在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
中设置window并makeKeyAndVisible
; 我按照这个来做了, 还是不行!!!!
于是继续找, 有的说是iOS7.0会有[UIApplication sharedApplication].keyWindow
获取不到keywindow的情况, iOS8.0就好多了, 这种情况下可以用[[[UIApplication sharedApplication] delegate] window];
代替, 然后试着这样做了, 结果还是显示不出来
于是重新创建了以window如上,[UIApplication sharedApplication].delegate.window有值了,但是[UIApplication sharedApplication].keyWindow为nil
且发现了一个新问题,页面不能进行点击,查看图层,原来上面有一层view,导致不能点击底部的tabbar
于是,我试着打断点调试,发现是makeKeyAndVisible方法的调用顺序影响,可看下图
接下来神奇的发现如果设置rootViewController放在viewWillAppear方法里面,这时候makeKeyAndVisible会在其设置rootViewController之后,导致UIWindow上蒙了一层view
到这里我们就发现罪魁祸首还是生命周期导致的,因此设置rootViewController,创建弹框的方法不要放在viewWillAppear也不要放在viewWillAppear
或者- (void)viewDidLayoutSubviews
方法里,我放在viewDidAppear里面就可以了
到了这里, 其实使用[UIApplication sharedApplication].keyWindow
或者[[[UIApplication sharedApplication] delegate] window]
都是可以实现效果的; 但还是比较推荐后者, 因为使用前者的话, 当你的app需要跳转到别的app然后返回本app的时候, 有可能会导致UI错乱, 使用后者就不会
注意**
*** 1 如果在之后想要自定义UIWindow
必须要设置[UIApplication sharedApplication].delegate.window
为想要设置的window
*** 2 如果弹框有跳转到其他app
的,最好使用[UIApplication sharedApplication].delegate.window
,否则有可能会出现UI错位