反向傳值
反向傳值有三種方式膊畴,分別是閉包、消息中心私蕾、單例
從后一個視圖控制器把值傳給前一個視圖控制器
閉包
//用閉包做反向傳值猎提,就是利用閉包的聲明、實(shí)現(xiàn)和調(diào)用:
//1.在下一個界面中聲明閉包(將要傳的值通過閉包的參數(shù)來傳)
//2.在上一個界面中界面跳轉(zhuǎn)到下一個界面的時候去實(shí)現(xiàn)閉包
//3.在下一個界面消失的時候去調(diào)用閉包
class FirstViewController: YTViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.btn.setTitle("界面1", forState: .Normal)
}
//實(shí)現(xiàn)父類按鈕點(diǎn)擊的方法
override func buttonAction(btn: UIButton) {
//跳轉(zhuǎn)到下一個界面
let second = SecondViewController()
//2.實(shí)現(xiàn)閉包
second.sendValue = {(value) in
//使用從上一個界面?zhèn)鬟^來的值
self.textField.text = value
}
self.presentViewController(second, animated: true, completion: nil)
}
}
=========================第二頁面================
class SecondViewController: YTViewController {
//MARK: - 屬性
//1.聲明閉包
var sendValue: ((String)->Void)? = nil
//MARK: - 方法
override func viewDidLoad() {
super.viewDidLoad()
self.btn.setTitle("界面2", forState: .Normal)
}
//實(shí)現(xiàn)父類的按鈕點(diǎn)擊方法
override func buttonAction(btn: UIButton) {
//3.調(diào)用閉包
self.sendValue!(self.textField.text!)
self.dismissViewControllerAnimated(true, completion: nil)
}
}
消息中心
//消息中心:相當(dāng)于生活中的廣播站寸五。1.用來發(fā)送消息梳凛;2.一個消息中心可以發(fā)送多條消息,每條消息以不同的消息名來區(qū)分
//觀察者:相當(dāng)于收音機(jī)梳杏。1.用來接收消息韧拒;2.能接收到消息的前提:a.消息中心發(fā)送消息,并且是實(shí)時的 b.觀察者觀察的消息名要和消息中心發(fā)送的消息的消息名保持一致 3.同一個觀察者可以接收不同的消息
//消息:消息中心發(fā)出的內(nèi)容/觀察者接收的內(nèi)容
//消息中心做反向傳值:在下一個界面中使用消息中心發(fā)送消息(消息的內(nèi)容就是要傳的值)十性;在上一個界面注冊觀察者來接收消息
class FirstViewController: YTViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.btn.setTitle("界面1", forState: .Normal)
//2.注冊成為觀察者
//參數(shù)1:觀察者對象
//參數(shù)2:消息中心發(fā)送消息的時候觀察者會自動調(diào)用的方法對應(yīng)的selector(觀察者接收到消息后會調(diào)用的方法)-->必須帶一個參數(shù)叛溢,并且參數(shù)的類型是NSNotification
//參數(shù)3:觀察者要觀察的消息的名字
NSNotificationCenter.defaultCenter().addObserver(self, selector: "notificationAction:", name: "nof1", object: nil)
}
func notificationAction(nof:NSNotification) {
//object屬性就是消息的內(nèi)容
print("接收到消息:\(nof.object)")
self.textField.text = nof.object as? String
}
//實(shí)現(xiàn)父類按鈕點(diǎn)擊的方法
override func buttonAction(btn: UIButton) {
//跳轉(zhuǎn)到下一個界面
let middle = MiddleViewController()
self.presentViewController(middle, animated: true, completion: nil)
}
}
=====================下一頁面================
class SecondViewController: YTViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.btn.setTitle("界面2", forState: .Normal)
}
//實(shí)現(xiàn)父類的按鈕點(diǎn)擊方法
override func buttonAction(btn: UIButton) {
//1.使用消息中心發(fā)送消息(消息的內(nèi)容就是要傳的值)
//a.拿到消息中心(單例對象)NSNotificationCenter.defaultCenter()
//b.發(fā)送消息
//參數(shù)1:消息名(相當(dāng)于頻段)
//參數(shù)2:要發(fā)送的消息的內(nèi)容
NSNotificationCenter.defaultCenter().postNotificationName("nof1", object: self.textField.text)
//返回上一個界面
self.dismissViewControllerAnimated(true, completion: nil)
}
}
單列
創(chuàng)建一個單列的類保證值得唯一性
class ValueManager: NSObject {
//1.保證當(dāng)前這個類只能創(chuàng)建出一個對象,而且這個對象必須defalutManager去拿到
//拿到當(dāng)前這個類唯一的對象
static let defalutManager = ValueManager()
//構(gòu)造方法私有化
private override init() {
}
//2.聲明一個屬性的類型是需要傳的值的類型
var sendValue = ""
}
==========第二個頁面========
class SecondViewController: YTViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
//實(shí)現(xiàn)父類的按鈕點(diǎn)擊方法
override func buttonAction(btn: UIButton) {
//3.拿到單例對象劲适,并且給屬性賦值
ValueManager.defalutManager.sendValue = self.textField.text!
//返回上一頁
self.dismissViewControllerAnimated(true, completion: nil)
}
}
==================第一頁面=========
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
//通過單例對象拿到值
self.textField.text = ValueManager.defalutManager.sendValue
}
//實(shí)現(xiàn)父類按鈕點(diǎn)擊的方法
override func buttonAction(btn: UIButton) {
//跳轉(zhuǎn)到下一個界面
let second = MiddleViewController()
self.presentViewController(second, animated: true, completion: nil)
}