iOS应用从ViewController 2转至1后按钮功能异常问题问询
问题分析与解决办法
你遇到的问题根源在于页面导航栈的混乱——当前的代码会创建一个全新的Start(ViewController 1)实例,而原来的ViewController 1并没有被正确清理掉,导致后续点击跳转按钮时,导航逻辑出现冲突。
错误原因拆解
你的代码先尝试让根控制器dismiss,然后又present一个新的ViewController 1:
let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) let newViewController = storyBoard.instantiateViewController(withIdentifier: "Start") as! Start view?.window?.rootViewController?.dismiss(animated: true, completion:nil) view?.window?.rootViewController?.present(newViewController, animated: false, completion: nil)
这种操作会导致:
- 原来的ViewController 1仍然存在于导航栈中
- 新的ViewController 1被叠加在原有页面之上
- 后续跳转按钮的点击会触发多层页面的导航逻辑,从而出现异常
正确的解决方式
方式1:直接dismiss回到原ViewController 1(推荐)
如果你的ViewController 2是通过present方式从ViewController 1跳转过来的,那么直接在ViewController 2中调用dismiss即可回到原有的ViewController 1,不需要重新实例化新页面:
// 这是present跳转对应的标准返回方式,完全符合iOS导航规范 dismiss(animated: true, completion: nil)
这种方式会保留原ViewController 1的所有状态,导航栈也会保持正常结构。
方式2:替换根控制器(仅适用于重置整个页面栈的场景)
如果你确实需要重置整个页面栈(比如用户退出登录后回到首页),可以直接替换根控制器,而不是先dismiss再present:
let storyBoard = UIStoryboard(name: "Main", bundle: nil) let newViewController = storyBoard.instantiateViewController(withIdentifier: "Start") as! Start // 直接替换根控制器,清空原有页面栈 view.window?.rootViewController = newViewController view.window?.makeKeyAndVisible()
注意:这种方式会销毁所有原有页面实例,如果有需要保存的状态,要提前做好数据持久化。
内容的提问来源于stack exchange,提问作者Hans Harck Tønning
相关产品推荐
相关产品推荐

