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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 07:15:07