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

如何识别跳转至ViewController的来源按钮?两按钮对应同一ViewController

如何识别AddDepartmentVC的跳转来源

这是iOS开发里很常见的场景,我给你推荐几种清晰易维护的解决方案:

方案一:使用枚举标记来源(最推荐)

这种方法语义化极强,代码可读性高,后续扩展也非常方便。

首先在AddDepartmentVC中定义一个枚举,用来表示不同的跳转来源,再添加一个对应的属性:

// AddDepartmentVC.swift
enum DepartmentVCSource {
    case edit
    case new
}

class AddDepartmentVC: UIViewController {
    // 存储跳转来源的属性
    var source: DepartmentVCSource?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 根据来源执行不同逻辑
        switch source {
        case .edit:
            title = "编辑部门"
            print("从编辑按钮跳转而来")
            // 这里可以加载编辑所需的数据、调整UI状态等
        case .new:
            title = "新建部门"
            print("从新建按钮跳转而来")
            // 初始化新建所需的空数据、重置UI状态等
        case nil:
            break
        }
    }
}

然后在ViewController1的两个按钮点击方法中,给AddDepartmentVC的source属性赋值:

// ViewController1.swift
@objc func btnEdit() {
    print("Edit")
    guard let editDeptt = self.storyboard?.instantiateViewController(withIdentifier: "Add Department") as? AddDepartmentVC else {
        return
    }
    editDeptt.source = .edit // 标记来源为编辑
    self.navigationController?.pushViewController(editDeptt, animated: true)
}

@IBAction func btnNewDeptt(_ sender: Any) {
    guard let addDepttVC = self.storyboard?.instantiateViewController(withIdentifier: "Add Department") as? AddDepartmentVC else {
        return
    }
    addDepttVC.source = .new // 标记来源为新建
    self.navigationController?.pushViewController(addDepttVC, animated: true)
}

方案二:使用按钮Tag传递标识(适合简单场景)

如果项目场景比较简单,也可以用按钮的tag属性来区分,但这种方法可读性不如枚举,后期维护需要记住tag对应的含义,所以只推荐在简单场景下使用。

首先给两个按钮设置不同的tag(可以在Storyboard中设置,或者代码里设置):

// ViewController1.swift - 在viewDidLoad中设置tag
override func viewDidLoad() {
    super.viewDidLoad()
    btnEdit.tag = 1 // 编辑按钮tag设为1
    // 新建按钮可以在Storyboard中把tag设为2,或者代码里设置
}

然后在AddDepartmentVC中添加一个存储tag的属性:

// AddDepartmentVC.swift
class AddDepartmentVC: UIViewController {
    var sourceTag: Int = 0
    
    override func viewDidLoad() {
        super.viewDidLoad()
        if sourceTag == 1 {
            print("来自编辑按钮")
            title = "编辑部门"
        } else if sourceTag == 2 {
            print("来自新建按钮")
            title = "新建部门"
        }
    }
}

最后在跳转时传递tag:

// ViewController1.swift
@objc func btnEdit() {
    print("Edit")
    guard let editDeptt = self.storyboard?.instantiateViewController(withIdentifier: "Add Department") as? AddDepartmentVC else {
        return
    }
    editDeptt.sourceTag = btnEdit.tag
    self.navigationController?.pushViewController(editDeptt, animated: true)
}

@IBAction func btnNewDeptt(_ sender: Any) {
    guard let button = sender as? UIButton,
          let addDepttVC = self.storyboard?.instantiateViewController(withIdentifier: "Add Department") as? AddDepartmentVC else {
        return
    }
    addDepttVC.sourceTag = button.tag // 直接取按钮的tag
    self.navigationController?.pushViewController(addDepttVC, animated: true)
}

小提示

  • 尽量避免直接传递按钮对象(sender)到目标VC,因为可能会引发不必要的引用循环,或者按钮的生命周期问题,传递明确的标识更安全。
  • 优先选择枚举方案,它的可读性和可维护性远高于tag方案,后续如果新增更多跳转来源,只需要给枚举添加新的case即可。

内容的提问来源于stack exchange,提问作者Ayush Agrawal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:16:00