浅谈控制器跳转(模态、push)

情景:控制器A present: 控制器B present:控制器C:切换根控制器:控制器D

问题:如果 在C跳转到D的跳转方法中直接写:[UIApplication sharedApplication].delegate.window.rootViewController = [ViewControllerD new]; A、B、C三个控制器都不会得到释放(不走dealloc方法)
解决办法:根据self.presentingViewController可以获取到当前控制器的父控制器,可以用循环实现
UIViewController *parentVC = self.presentingViewController;
UIViewController *bottomVC;
while (parentVC) {
bottomVC = parentVC;
parentVC = parentVC.presentingViewController;
}
[bottomVC dismissViewControllerAnimated:YES completion:nil];
[UIApplication sharedApplication].delegate.window.rootViewController = [ViewControllerD new];
这样的话,A、B、C三个控制器才都会得到释放
Notice:但是发现了新的问题

由于D中没有任何东西,甚至连背景色都没添加!所以在切换根视图控制器后,发现D视图上居然显示出最底部A视图的界面!再确认根控制器确实是D并且A、B、C都进入dealloc中销毁掉后,WTF ?视图销毁后它的视图不应该就没有了吗,实在是想不通。
解决办法:经测试发现 释放A、B、C是个耗时操作,需要一定得时间(先释放C,最后释放A,有顺序的),故只有当释放完成再执行切换根控制器的操作才不会有此bug。
//把最前面的视图控制器dismiss掉
UIViewController *parentVC = self.presentingViewController;
UIViewController *bottomVC;
while (parentVC) {
bottomVC = parentVC;
parentVC = parentVC.presentingViewController;
}
[bottomVC dismissViewControllerAnimated:NO completion:^{
//dismiss后再切换根视图
[UIApplication sharedApplication].delegate.window.rootViewController = [TabBarController new];
}];

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容