iOS-[UIApplication sharedApplication].keyWindow和[UIApplication sharedApplication].delegate.window

原创 MinggeQingchun

原文链接:https://blog.csdn.net/MinggeQingchun/article/details/98237511

本人最近在重新做一个新项目,设置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错位

————————————————

版权声明:本文为CSDN博主「MinggeQingchun」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/MinggeQingchun/article/details/98237511

你可能感兴趣的:(iOS-[UIApplication sharedApplication].keyWindow和[UIApplication sharedApplication].delegate.window)