模态展示NavigationController后isBeingPresented值不一致问题咨询
isBeingPresented状态变化的分析与解决 你遇到的这个情况确实挺费解的——当你以模态方式展示嵌套了ViewController的UINavigationController时,在根ViewController里检查self.navigationController.isBeingPresented会返回true,但push新VC再pop回来后,同一个检测就变成false了,而且相关官方文档也没明确解释这个行为,很容易误以为是系统bug。
其实这大概率不是bug,而是UIKit对isBeingPresented属性的判定逻辑导致的。这个属性的核心是判断当前控制器所在的导航控制器是否正处于被模态呈现的过程中,或者说它的呈现上下文有没有发生动态变化。当你执行push/pop操作时,虽然导航控制器的视图层级回到了初始状态,但UIKit内部可能已经更新了导航控制器的呈现状态标记——毕竟push/pop属于导航栈内部的跳转,不会改变导航控制器本身的模态呈现状态,但系统在栈操作后可能重置了这个属性的判定逻辑。
如果你需要持续判断导航控制器是否处于模态展示状态,更可靠的方式是用self.navigationController.presentingViewController != nil来替代。这个属性会直接检查导航控制器是否存在一个正在呈现它的父控制器,只要导航控制器还是模态展示的状态,这个值就会一直为true,不会受栈内push/pop操作的影响。
给你个代码示例:
// 替换原来的检测逻辑 if let navController = self.navigationController, navController.presentingViewController != nil { // 导航控制器处于模态展示状态 print("当前导航控制器是模态展示的") } else { // 导航控制器非模态展示状态 print("当前导航控制器不是模态展示的") }
另外,你也可以通过监听导航栈的变化或者观察导航控制器的presentedViewController属性来辅助验证,但presentingViewController是最直接且稳定的判断方式。
内容的提问来源于stack exchange,提问作者Alper

