You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无Storyboard时iOS中ViewController之间跳转的正确方式是什么?

问题解答

1. 当前跳转方式的正确性判断

你目前使用的present模态跳转语法本身没有问题,但不适合登录/注册完成后跳转主页的场景。
你观察到主视图控制器没有执行deinit是正常现象:模态弹出的本质是将新的视图控制器层级盖在当前控制器上层,原有控制器会被新控制器的presentingViewController属性持有,不会被释放,因此不会触发deinit方法。

2. pushViewController失效的原因

该方法失效和是否使用Storyboard没有关联,原因是你当前的主视图控制器没有被嵌入到UINavigationController导航栈中,导致navigationController属性为nil,调用自然不生效。如果需要使用push跳转,需要在项目入口(AppDelegate/SceneDelegate)初始化根视图时,给主控制器套一层导航控制器,示例代码如下:

// SceneDelegate 示例(iOS 13+)
guard let windowScene = (scene as? UIWindowScene) else { return }
let window = UIWindow(windowScene: windowScene)
let mainVC = MainViewController()
// 给主控制器包裹导航控制器,后续mainVC的navigationController属性就会有值
window.rootViewController = UINavigationController(rootViewController: mainVC)
self.window = window
window.makeKeyAndVisible()

配置完成后就可以正常使用push跳转:

let vc = SecondViewController()
self.navigationController?.pushViewController(vc, animated: true)

3. 登录/注册完成后的最优跳转方案

因为登录注册是一次性流程,用户完成操作后不需要再回退到登录注册页,最优方案是直接替换App的根视图控制器,原有登录/注册控制器会被完全释放,自动触发deinit,也不会产生冗余内存占用,示例代码如下:

// 登录/注册成功后执行
let homeVC = HomeViewController()
// 可以根据需求决定是否给主页包裹导航控制器
UIApplication.shared.keyWindow?.rootViewController = UINavigationController(rootViewController: homeVC)
// 可选:添加过渡动画避免跳转生硬
UIView.transition(with: UIApplication.shared.keyWindow!, duration: 0.3, options: .transitionCrossDissolve, animations: nil, completion: nil)

补充:present模态跳转的适用场景

你当前用的present方法更适合需要用户临时处理任务、完成后可关闭回到原页面的场景,比如编辑个人资料、选择上传图片等临时流程。

内容的提问来源于stack exchange,提问作者Mr N

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 21:39:03