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

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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值