一.设置代理Delegate
将 VC2 的一个值传回到 VC1
// 设置代理
class VC1: UIViewController, VC2Delegate{
// (3)设置 VC2 的代理为 VC1
VC2.vc2delegate = self
// (4)实现代理方法,VC2 调用代理时,会将值传到这里
func passDataBackToVC1(value: String) {
print(value) //"DataDataData"
}
}
// (1)定义一个 protocol
protocol VC2Delegate: class {
func passDataBackToVC1(value: String)
}
class VC2: UIViewController {
// (2)VC2 需要一个代理
var vc2delegate = VC2Delegate?
// (5)VC2 调用代理,并将值传给代理
func callDelgate() {
vc2delegate.passDataBackToVC1(value: "DataDataData")
}
}
二.使用通知Notification
VC2 发送通知到 VC1
// 使用通知
class VC1: UIViewController{
override func viewDidLoad() {
// (2)注册一个观察者 Observer 接收名为"passDataBack"的消息
NotificationCenter.default.addObserver(self, selector: #selector(receiveData), name: NSNotification.Name("passDataBack"), object: nil)
// (3)收到通知之后可以调用下面的方法,使用消息里的值
@objc func receiveData(notification: Notification) {
let data = notification.userInfo?["IntNumber"]
}
}
deinit {
// (4)移除接收名为"passDataBack"通知的观察者
NotificationCenter.default.removeObserver(self, name: NSNotification.Name("passDataBack"), object: nil)
}
}
class VC2: UIViewController {
override func viewDidLoad() {
// (1)通知中心发送通知,通知的名称为"passDataBack",通知中包括 一个 “IntNumber”, 其值为5
NotificationCenter.default.post(name: NSNotification.Name("passDataBack"), object: self, userInfo: ["IntNumber": 5])
}
}
三.闭包传值
class VC1: UIViewController {
@IBOutlet weak var showLabel: UILabel!
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "goNext" {
let vc = segue.destination as! VC2
// (4)使用闭包中的值
vc.backBlockClosure = { (string: String) -> Void in
self.showLabel.text = string
}
}
}
}
// (1)声明一个闭包类型
typealias BackBlock = (String) -> Void
class VC2: UIViewController {
// (2)定义一个闭包变量
var backBlockClosure: BackBlock?
@IBAction func clickToPassData(_ sender: UIButton) {
// (3)调用闭包传值
self.backBlockClosure!("Label change to Smile")
}
}
网友评论