解除后对前一个视图控制器的操作

Action on the previous view controller after a dismiss

我有两个视图控制器。通过按下按钮 1,我从 VS_1 更改为 VS_2。通过按下按钮 2,我转到视图 controller_1。此时我需要 button1 将其颜色更改为红色。怎么做?

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

        self.present(vC2, animated: true, completion: nil)
    }
}

class VC_2: UIViewController{

    ..........
    var button2 = UIButton()
    button2.backgroundColor = .green

    @IBAction func goToVC_1(_ sender: Any) {

        self.dismiss(animated: true, completion: nil)
    }

}

你可以通过回调、委托等方式完成

通过回调:

@IBAction func goToVC_2(_ sender: Any) {

    let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
    let vC2 = storyBoard.instantiateViewController(withIdentifier: "VC2") as! VC_2

    vC2.didTapButton = {
        // change color here 
    }
    self.present(vC2, animated: true, completion: nil)
}


var didTapButton: () -> Void = { }

@IBAction func goToVC_1(_ sender: Any) {
    didTapButton()
    self.dismiss(animated: true, completion: nil)
}

可以像这样使用委托来完成:

第一视图控制器:

import UIKit

class FirstViewController: UIViewController, BackButtonDelegate {
 
    @IBOutlet weak var goVC2ButtonOutlet: UIButton!
    
    func onBackButtonClicked(firstButtonColor: UIColor) {
        self.goVC2ButtonOutlet.backgroundColor = firstButtonColor
    }
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
         if segue.identifier == "goSecondVC" {
             let secondVC: SecondViewController = segue.destination as! SecondViewController
             secondVC.delegate = self
         }
     }
}

第二个视图控制器:

import UIKit

protocol BackButtonDelegate {
    func onBackButtonClicked(firstButtonColor: UIColor)
}

class SecondViewController: UIViewController {
    
    var delegate: BackButtonDelegate? = nil
    
    @IBAction func goVC1(_ sender: UIButton) {
        
        if self.delegate != nil {
            let colorToBeSetOnButtonFromFirstVC = UIColor.red // here you set what color you want
            self.delegate?.onBackButtonClicked(firstButtonColor: colorToBeSetOnButtonFromFirstVC)
            navigationController?.popViewController(animated: true)
        }
    }
}

演示: