通知傳值
首先我們來看看通知傳值,通知可實(shí)現(xiàn)任意界面之間的數(shù)據(jù)傳遞纹安,但必須滿足一個(gè)條件在岂,就是保證在發(fā)送通知的時(shí)候監(jiān)聽者已經(jīng)存在(先要注冊(cè)通知)。而通知的注冊(cè)主要通過NSNotificationCenter通知中心實(shí)現(xiàn)技即,其為一個(gè)系統(tǒng)單例,系統(tǒng)提供了defaultCenter()方法獲取通知實(shí)例對(duì)象樟遣。
通知使用步驟:注冊(cè)通知 -> 發(fā)送通知 -> 移除通知
通知實(shí)現(xiàn)的原理而叼,我們可以這樣去理解,學(xué)生監(jiān)聽下課鈴聲豹悬。我們把學(xué)生看做監(jiān)聽者(或者叫觀察者)葵陵,監(jiān)聽鈴聲,鈴聲一響就放學(xué)瞻佛。當(dāng)鈴聲響起時(shí)脱篙,我們看做發(fā)出一個(gè)通知(信號(hào)),學(xué)生在監(jiān)聽到鈴聲之后就會(huì)做出相應(yīng)的操作,比如放學(xué)之后做什么……
接下來我們看看通知傳值的具體實(shí)現(xiàn)方式绊困。這里我們模擬從詳情界面?zhèn)髦档街鹘缑嫒坛冢瑸榱私y(tǒng)一,下文都用ViewController表示主界面考抄,DetailViewController表示詳情界面细疚。首先我們需要在主界面注冊(cè)通知,因?yàn)榇罚绦蜻\(yùn)行肯定是先到主界面中疯兼,所以,當(dāng)在詳情界面發(fā)送通知的時(shí)候贫途,通知監(jiān)聽者肯定是存在的吧彪。注冊(cè)通知的方法常用的有以下兩種:
// 1、publicfunc addObserver(observer: AnyObject, selector aSelector: Selector, name aName:String?, object anObject: AnyObject?)// 2丢早、publicfunc addObserverForName(name:String?, object obj: AnyObject?,queue: NSOperationQueue?, usingBlock block: (NSNotification)->Void)->NSObjectProtocol
第1種姨裸,我們需要通過Selector參數(shù)設(shè)置接收到通知時(shí)觸發(fā)的方法。而第2種怨酝,我們無需關(guān)聯(lián)觸發(fā)方法傀缩,在方法尾部跟著一個(gè)閉包,當(dāng)接收到通知的時(shí)候該閉包會(huì)自動(dòng)調(diào)用农猬,我們可直接在閉包內(nèi)處理相應(yīng)的邏輯即可赡艰。第2種方法還有一個(gè)參數(shù)queue,該參數(shù)主要設(shè)置通知觸發(fā)方法執(zhí)行的隊(duì)列斤葱,其為NSOperationQueue類型的對(duì)象慷垮,這里我們一般在主隊(duì)列執(zhí)行,配置參數(shù)方法為NSOperationQueue.mainQueue()揍堕。我們可以直觀的看到料身,在兩種方法中都有一個(gè)name參數(shù),該參數(shù)我們可以理解為通知的代號(hào)衩茸,通過這個(gè)代號(hào)我們可以避免多個(gè)通知串聯(lián)芹血,這個(gè)參數(shù)我們可以賦值任意字符串。此處以第2種為例递瑰。
//1祟牲、register notificationNSNotificationCenter.defaultCenter().addObserverForName("notification_name", object: nil, queue: NSOperationQueue.mainQueue()) { (info: NSNotification) -> Voidin// 處理接收到通知之后執(zhí)行的邏輯...}
通知注冊(cè)好之后隙畜,下一步我們就可以在詳情界面發(fā)送通知了抖部,我們?cè)谔幚斫缑嫣D(zhuǎn)(返回)的方法中處理這一邏輯。發(fā)送通知主要用到以下方法:
// 發(fā)送通知publicfuncpostNotificationName(aName: String,objectanObject: AnyObject?, userInfo aUserInfo: [NSObject : AnyObject]?)
這里需要注意议惰,發(fā)送通知的aName參數(shù)慎颗,必須和注冊(cè)通知時(shí)的name參數(shù)一致,否則在主界面將無法接收到通知。我們可通過aUserInfo參數(shù)將需要傳遞的數(shù)據(jù)傳遞到主界面中俯萎,該參數(shù)為一個(gè)[NSObject : AnyObject]?(字典)類型的數(shù)據(jù)傲宜。實(shí)現(xiàn)示例如下:
func respondsToBtn(sender:UIButton) {// 2、post notification and send valueNSNotificationCenter.defaultCenter().postNotificationName("notification_name", object:nil, userInfo: ["text":self.textField.text!])self.dismissViewControllerAnimated(true, completion:nil)}
當(dāng)用戶點(diǎn)擊返回按鈕時(shí)夫啊,發(fā)送通知函卒,主界面接收到對(duì)應(yīng)通知之后將會(huì)回調(diào)閉包,我們可在閉包中打印傳遞過來的數(shù)據(jù)撇眯,如下所示:
NSNotificationCenter.defaultCenter().addObserverForName("notification_name", object: nil, queue: NSOperationQueue.mainQueue()){(info)->Voidinprint((info.userInfo!["text"])!)
}
到了這一步报嵌,我們已經(jīng)基本實(shí)現(xiàn)通知傳值了,我們還需要最后一步熊榛,移除通知锚国,通知的移除我們可在界面釋放的方法(析構(gòu)方法)中去執(zhí)行,如下所示:
deinit {
// 3玄坦、removenotificationNSNotificationCenter.defaultCenter().removeObserver(self)
}