Swift中自定义无Storyboard的错误提示VC返回按钮失效问题求助
问题根源分析
你的问题出在错误VC的导航栈结构上:当你创建新的UINavigationController并将其设置为window的rootViewController时,原来的页面栈已经被完全替换了——这个新导航栈里只有SomethingWentWrongVC这一个控制器。所以调用popToRootViewController时,因为它本身就是栈底的root控制器,自然不会有任何跳转效果。
解决方案
下面提供两种常用的修复方案,你可以根据场景选择:
方案1:使用present方式展示错误VC(推荐)
这种方式更符合iOS的交互逻辑,不需要替换root控制器,直接从当前页面弹出错误VC,点击按钮后dismiss即可返回。
步骤1:修改错误VC的调用代码
在需要展示错误提示的地方,用当前控制器present错误VC:
// 创建错误VC实例 let errorVC = SomethingWentWorngVC(nibName: "SomethingWentWorngView", bundle: nil) // 如果你需要给错误VC加导航栏,可以包装一个UINavigationController let navVC = UINavigationController(rootViewController: errorVC) // present展示 self.present(navVC, animated: true)
步骤2:修改refresh按钮的点击事件
把pop操作改成dismiss:
@IBAction func refreshAction(_ sender: Any) { self.dismiss(animated: true) }
方案2:保存原root控制器,点击时恢复
如果你一定要保留替换rootViewController的方式,需要先保存原来的页面栈,点击按钮时再恢复回去。
步骤1:修改错误VC的调用代码
展示错误VC前,先保存当前的root控制器,并传递给错误VC:
// 保存原来的root控制器 guard let originalRoot = window?.rootViewController else { return } // 创建错误VC并传入原root let errorVC = SomethingWentWorngVC(nibName: "SomethingWentWorngView", bundle: nil) errorVC.originalRootViewController = originalRoot // 创建导航控制器并设置为新root let navController = UINavigationController(rootViewController: errorVC) window?.rootViewController = navController window?.makeKeyAndVisible()
步骤2:修改SomethingWentWrongVC的代码
添加一个属性存储原root控制器,并修改点击事件:
// 新增属性保存原root控制器 var originalRootViewController: UIViewController? @IBAction func refreshAction(_ sender: Any) { guard let originalRoot = originalRootViewController, let window = self.window else { return } // 恢复原来的root控制器 window.rootViewController = originalRoot window.makeKeyAndVisible() }
额外提示
- 优先选择方案1,因为它遵循iOS的标准交互模式,用户体验更自然,也不需要处理复杂的页面栈替换逻辑。
- 如果使用方案2,注意如果原页面栈有需要保留的状态(比如用户输入的内容),替换root时要确保这些状态不会丢失。
内容的提问来源于stack exchange,提问作者lqsdwtxkzlqafpvluq
相关产品推荐
相关产品推荐

