performSegue跳转两个VC,其中一个navigationController为nil问题排查
问题排查与解决思路
针对你遇到的FeatureGeometryController通过Show segue push后navigationController为nil的问题,以下是几个常见的排查方向:
1. 检查Storyboard中Segue的目标与Presentation设置
- 确认segue的目标是
FeatureGeometryController本身,而非它所在的UINavigationController:如果不小心将segue拖到了嵌套的导航控制器上,push到栈中的会是这个新的导航控制器,而FeatureGeometryController作为它的根VC,其navigationController会指向这个嵌套实例(或因配置异常返回nil)。 - 检查segue的Presentation属性(iOS 13+):选中segue后在Attributes Inspector中查看,若Presentation被改为
Page Sheet/Form Sheet等非Full Screen/Automatic的选项,Show segue会以模态方式呈现VC,而非push到原导航栈,此时目标VC的navigationController必然为nil。改回Automatic或Full Screen即可。
2. 检查FeatureGeometryController的代码冲突
- 确认该类中没有自定义同名的
navigationController属性:如果手动定义了var navigationController: UINavigationController?或类似属性,会覆盖UIViewController自带的只读计算属性,导致系统无法正确返回所属的导航控制器。删除自定义的同名属性即可。
3. 检查FeatureGeometryController的Storyboard独立配置
- 确认该VC没有被设置为某个
UINavigationController的初始VC(即未勾选Is Initial View Controller):如果该VC是某个导航控制器的根VC,且segue直接指向这个VC,Storyboard可能会自动将其包装进新的导航控制器,导致push的是新导航控制器而非VC本身,进而使VC的navigationController指向这个新实例(或出现nil异常)。
4. 验证导航栈状态
- 在触发segue前,打印当前VC的导航栈状态,确认原导航栈正常:
若栈状态异常(比如当前VC已不在栈中),则需要排查是否有其他代码意外修改了导航栈。@objc func handleButtonAction() { print("Current navigation stack: \(navigationController?.viewControllers ?? [])") performSegue(withIdentifier: "Feature Geometry", sender: self) }
内容的提问来源于stack exchange,提问作者Son of a Beach
相关产品推荐
相关产品推荐

