点击backBarButtonItem时跳过ViewController的无Storyboard实现方案
无Storyboard实现从MainVC直接返回StartVC的方案
以下是三种可行的无Storyboard实现方案,可根据需求选择:
方案一:自定义返回按钮替换系统返回按钮
直接在MainVC中创建自定义返回按钮,点击时跳过CreateVC直接回到StartVC:
import UIKit class MainVC: UIViewController { override func viewDidLoad() { super.viewDidLoad() // 创建自定义返回按钮,样式可按需调整 let backButton = UIBarButtonItem(title: "返回", style: .plain, target: self, action: #selector(backToStartVC)) navigationItem.leftBarButtonItem = backButton } @objc private func backToStartVC() { // 从导航栈中查找StartVC实例 if let startVC = navigationController?.viewControllers.first(where: { $0 is StartVC }) { navigationController?.popToViewController(startVC, animated: true) } else { // 找不到时默认返回根视图 navigationController?.popToRootViewController(animated: true) } } }
优点:逻辑直观,完全掌控返回行为;缺点:需自行适配系统返回按钮的样式与交互细节。
方案二:跳转时修改导航栈结构
在CreateVC跳转到MainVC的过程中,直接将CreateVC从导航栈中移除,让系统返回按钮默认指向StartVC:
import UIKit class CreateVC: UIViewController { // 假设这是触发跳转的按钮点击方法 @objc private func navigateToMainVC() { let mainVC = MainVC() guard let navController = navigationController else { return } // 获取当前导航栈,移除自身(CreateVC) var updatedViewControllers = navController.viewControllers updatedViewControllers.removeLast() // 添加MainVC到栈中 updatedViewControllers.append(mainVC) // 更新导航栈,保持跳转动画 navController.setViewControllers(updatedViewControllers, animated: true) } }
优点:保留系统返回按钮的原生样式与交互,用户体验更统一;缺点:CreateVC会被直接移出栈,后续无法再通过返回回到该页面。
方案三:通过导航代理拦截返回行为
让MainVC遵守UINavigationControllerDelegate,拦截系统返回事件,替换跳转目标:
import UIKit class MainVC: UIViewController, UINavigationControllerDelegate { override func viewDidLoad() { super.viewDidLoad() navigationController?.delegate = self } func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) { // 检测到即将返回CreateVC时,替换为返回StartVC if viewController is CreateVC { // 先取消当前的返回动画 navigationController.popViewController(animated: false) // 直接跳转到StartVC if let startVC = navigationController.viewControllers.first(where: { $0 is StartVC }) { navigationController.popToViewController(startVC, animated: true) } } } deinit { // 移除代理,避免循环引用 navigationController?.delegate = nil } }
优点:无需替换系统返回按钮,同时修改返回逻辑;缺点:需要处理代理的生命周期,注意避免内存泄漏。
内容的提问来源于stack exchange,提问作者CT4TuEI3
相关产品推荐
相关产品推荐

