前两天对项目进行启动优化,更改启动广告的逻辑偶然间发现了一个问题,就是我们的自定义的版本更新弹窗是添加在Window
上的,当切换了rootViewController
的时候发现更新弹窗竟然消失了。
后面我模拟了下当前业务逻辑。应用启动时在当前的Window
上添加了一个视图
UIView *alertView = [[UIView alloc] init];
alertView.bounds = CGRectMake(0, 0, 100, 100);
alertView.center = self.window.center;
alertView.backgroundColor = UIColor.greenColor;
[self.window addSubview:alertView];
大致的效果就是这个样子
然后我在添加了alertView
后添加了一个定时器,定时器结束的时候切换rootViewController
。
UIView *alertView = [[UIView alloc] init];
alertView.bounds = CGRectMake(0, 0, 100, 100);
alertView.center = self.window.center;
alertView.backgroundColor = UIColor.greenColor;
[self.window addSubview:alertView];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
self.window.rootViewController = [[TestViewController alloc] init];
});
然后得到了这样的结果。可以看到中间的小绿块不见了,随后开始自己的猜想,想到是不是被当前的rootViewController
给挡住了,毕竟设置根控制器也不过是往Window
上添加视图。
那么就查看一下当前页面的视图结构。
可以看到当前的
UIWindow
上是有一个尺寸为100
的视图的,也就和我们上面的结论一致。那么现在只需要在添加根控制器的时候设置一下其视图位置即可。
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
self.window.rootViewController = [[TestViewController alloc] init];
[self.window bringSubviewToFront:alertView];
});
但实际业务中我们根本不可能去这么处理,首先就是你不一定在项目的任何地方能够很简单的获取到当前添加在Window
上的视图。所以这种处理方式得排除。
那么就只能在设置根控制器的时候对根控制器去做处理了,这样仅需要提供一个设置根控制器的方法给全局使用即可,内部全部走这个逻辑就没啥问题了。
self.window.rootViewController = [[TestViewController alloc] init];
[self.window insertSubview:self.window.rootViewController.view atIndex:0];