dismiss返回上一视图控制器后修改原控制器按钮颜色如何实现
实现方案
这里提供两种iOS页面间反向传值的常用实现,优先推荐闭包方案,代码更简洁。
方案1:闭包回调(最简实现)
实现逻辑
- 在VC_2中声明一个无返回值的可选闭包属性,用于承载返回时需要执行的外部逻辑
- VC_1跳转至VC_2时,给VC_2的闭包属性赋值,实现修改button1颜色的逻辑
- VC_2点击返回按钮时,先触发闭包再执行页面dismiss操作
修改后代码
class VC_1: UIViewController{ var button1 = UIButton() button1.backgroundColor = .green @IBAction func goToVC_2(_ sender: Any) { let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) let vC2 = storyBoard.instantiateViewController(withIdentifier: "VC2") as! VC_2 // 给VC2的闭包赋值,实现改色逻辑,加weak避免循环引用 vC2.backAction = { [weak self] in self?.button1.backgroundColor = .red } self.present(vC2, animated: true, completion: nil) } } class VC_2: UIViewController{ var button2 = UIButton() button2.backgroundColor = .green // 声明回调闭包 var backAction: (() -> Void)? @IBAction func goToVC_1(_ sender: Any) { // 先触发回调 backAction?() self.dismiss(animated: true, completion: nil) } }
方案2:代理模式(适合多回调逻辑的复杂场景)
实现逻辑
- 定义VC_2的代理协议,声明返回时的回调方法
- VC_1遵守该协议,实现回调方法中修改按钮颜色的逻辑
- VC_1跳转时将自身赋值为VC_2的代理
- VC_2点击返回时调用代理方法触发逻辑
修改后代码
// 定义VC2的代理协议 protocol VC2Delegate: AnyObject { func vc2WillDismiss() } class VC_1: UIViewController, VC2Delegate{ var button1 = UIButton() button1.backgroundColor = .green @IBAction func goToVC_2(_ sender: Any) { let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) let vC2 = storyBoard.instantiateViewController(withIdentifier: "VC2") as! VC_2 // 设置代理 vC2.delegate = self self.present(vC2, animated: true, completion: nil) } // 实现代理方法 func vc2WillDismiss() { button1.backgroundColor = .red } } class VC_2: UIViewController{ var button2 = UIButton() button2.backgroundColor = .green // 声明代理属性,用weak避免循环引用 weak var delegate: VC2Delegate? @IBAction func goToVC_1(_ sender: Any) { // 调用代理方法 delegate?.vc2WillDismiss() self.dismiss(animated: true, completion: nil) } }
内容的提问来源于stack exchange,提问作者SashDing
相关产品推荐
相关产品推荐

