最近在做一个邮政的项目,在刚进入邮寄控制器的时候需要对用户是否有未交寄的订单进行判断,如果有的话需要用提醒框告诉用户,如下图
可是在网络状态不好的情况下,接口的响应需要时间,在没有弹出UIAlertController的时候,用户可能会进入其他的页面就回导致以下的两个问题。
Presenting view controllers on detached view controllers is discouraged
当用户在没有弹出提醒框的时候,push进入了下一个控制器。虽然在下一个控制器可以弹出提醒框,但是会报出这个警告。
这个警告的条件是需要弹出UIAlertController的控制器仍然在导航控制器的栈中,但不是栈顶控制器。Attempt to present whose view is not in the window hierarchy
这个警告和上个警告的区别在于,控制器已经不在导航控制器的栈中了(用户pop返回了上级页面)。控制器已经不在窗口的层级中了。
导致的问题:
虽然上面的问题不会让程序崩溃,但是会让以后项目的层级混乱,不易于维护.而且会导致控制器一直无法被销毁.
解决方法:
- 可以使用蒙板,在提示框没有展示之前,防止用户点击。
- 判断导航控制器的栈顶控制器是否为当前控制器
if ([self.navigationController.topViewController isMemberOfClass:[self class]]) {
[self presentViewController:alertC animated:YES completion:nil];
}
3.不要再viewDidLoad里面去modal一个控制器, 要将modal代码放进viewDidAppear中,否则会导致Attempt to present whose view is not in the window hierarchy.
4.将modal代码改为
[self.view.window.rootViewController presentViewController:viewController animated:YES completion:nil];
但是我认为这个方法治标不治本.