iOS切换RootViewController,Window上的UIView隐藏的问题

前两天对项目进行启动优化,更改启动广告的逻辑偶然间发现了一个问题,就是我们的自定义的版本更新弹窗是添加在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];

大致的效果就是这个样子


image.png

然后我在添加了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上添加视图。

image.png

那么就查看一下当前页面的视图结构。
image.png

可以看到当前的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];

你可能感兴趣的:(iOS切换RootViewController,Window上的UIView隐藏的问题)