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

点击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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 12:01:11