解除后对前一个视图控制器的操作
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)
}
}
}
演示:
我有两个视图控制器。通过按下按钮 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)
}
}
}
演示: