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

iOS开发:点击Edit/Done按钮时切换导航栏Back与Cancel按钮

实现导航栏Back与Cancel按钮切换的方法

你可以通过保存原始左侧导航按钮、动态替换自定义按钮的方式实现需求,以下是修改后的完整代码:

class NewViewController: UIViewController {

    @IBOutlet weak var editBarButtonItem: UIBarButtonItem!
    
    private var editMode: Bool = false
    // 存储初始的左侧导航按钮,用于退出编辑模式时恢复
    private var originalLeftBarButtonItem: UIBarButtonItem?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // 保存系统默认的Back按钮
        originalLeftBarButtonItem = navigationItem.leftBarButtonItem
    }
    
    @IBAction func editButtonClick(_ sender: Any) {
        if editMode {
            // 退出编辑模式:切换回Edit按钮,恢复Back按钮
            editBarButtonItem.title = "Edit"
            navigationItem.leftBarButtonItem = originalLeftBarButtonItem
        } else {
            // 进入编辑模式:切换为Done按钮,替换为Cancel按钮
            editBarButtonItem.title = "Done"
            let cancelButton = UIBarButtonItem(title: "Cancel", style: .plain, target: self, action: #selector(cancelButtonTapped))
            navigationItem.leftBarButtonItem = cancelButton
        }
        
        editMode.toggle()
    }
    
    @objc private func cancelButtonTapped() {
        // 根据页面的呈现方式选择返回逻辑
        if let navController = navigationController {
            // 页面通过push进入,执行pop返回
            navController.popViewController(animated: true)
        } else {
            // 页面通过present弹出,执行dismiss返回
            dismiss(animated: true)
        }
    }
}

关键说明:

  • 保存原始按钮:在viewDidLoad中记录系统默认的Back按钮,确保退出编辑模式时能准确恢复
  • 自定义Cancel按钮:进入编辑模式时创建Cancel按钮,并绑定点击事件,模拟Back按钮的返回行为
  • 适配不同导航场景:根据页面是push还是present的方式,在cancelButtonTapped中选择对应的返回方法

内容的提问来源于stack exchange,提问作者Cheok Yan Cheng

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 00:11:13