如何在自定义框架中正确嵌入UINavigationController实现视图跳转
问题原因
你在Storyboard中虽然将根视图控制器嵌入了UINavigationController,但跳转时直接实例化了作为导航子节点的MessagePriviewVC,而非作为入口的UINavigationController,导致这个VC从始至终没有被纳入导航栈管理,因此self.navigationController读取结果始终为nil,所有基于导航栈的pop操作都无法生效。
修复步骤
- 打开框架内的FAUMEStoryboard,选中作为入口的UINavigationController,给它设置唯一的Storyboard ID,比如命名为
FAUMENavRoot - 修改外部跳转的初始化逻辑,改为实例化导航控制器后再弹出,示例代码如下:
if let urlString = Bundle.main.path(forResource: "FAUMESDK", ofType: "framework", inDirectory: "Frameworks"), let bundle = Bundle(url: URL(fileURLWithPath: urlString)) { let sb = UIStoryboard(name: "FAUMEStoryboard", bundle: bundle) // 实例化导航控制器作为弹出的根容器 guard let rootNav = sb.instantiateViewController(withIdentifier: "FAUMENavRoot") as? UINavigationController else { return } rootNav.modalPresentationStyle = .fullScreen self.show(rootNav, sender: nil) }
- 框架内部后续视图控制器的跳转统一使用
navigationController?.pushViewController实现,不要直接用present模态弹出业务VC,保证所有内部VC都处于同一个导航栈中 - 完成以上配置后,你原有的返回根视图代码即可正常运行:
navigationController?.popToRootViewController(animated: true)
可选排查项
如果修改后依然存在问题,可以核对以下配置:
- 确认Storyboard中的UINavigationController已经勾选
Is Initial View Controller,是Storyboard的默认入口 - 确认所有内部跳转逻辑没有打断导航栈结构,没有中途模态弹出新的VC层级
- 确认Storyboard ID的拼写、VC的类型转换没有错误
内容的提问来源于stack exchange,提问作者danu
相关产品推荐
相关产品推荐

