如何识别跳转至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
相关产品推荐
相关产品推荐

