首先来看一下 API:
/**************** Notification Center ****************/
open class NotificationCenter : NSObject {
// default 一个类属性,是获取NotificationCenter的
open class var `default`: NotificationCenter { get }
/*
添加观察者的方法。
observer: 给通知中心添加的观察者是谁,一般是 self
selector:响应的方法,就是接收到通知之后做的响应。
name: 观察的对象。可以是系统已经给好的观察者属性,比如 textView 是否在编辑,键盘是否弹出的。也可以是自己定义的 NSNotification
*/
open func addObserver(_ observer: Any, selector aSelector: Selector, name aName: NSNotification.Name?, object anObject: Any?)
// 发布消息
open func post(_ notification: Notification)
// 发布消息
open func post(name aName: NSNotification.Name, object anObject: Any?)
// 发布消息,携带信息userInfo
open func post(name aName: NSNotification.Name, object anObject: Any?, userInfo aUserInfo: [AnyHashable : Any]? = nil)
// 移除观察者
open func removeObserver(_ observer: Any)
// 移除观察者
open func removeObserver(_ observer: Any, name aName: NSNotification.Name?, object anObject: Any?)
@available(iOS 4.0, *)
open func addObserver(forName name: NSNotification.Name?, object obj: Any?, queue: OperationQueue?, using block: @escaping (Notification) -> Swift.Void) -> NSObjectProtocol
}
复制代码
// 获取NotificationCenter
let center = NotificationCenter.default
复制代码
三种使用方式: 1.使用系统存在的观察 name, 示例 textView 改变的时候
NotificationCenter.default.addObserver(self, selector: #selector(changeTextView), name: NSNotification.Name.UITextViewTextDidChange, object: nil)
复制代码
当 textView 改变的时候就发出通知,此时不需要调用 post 方法。直接就会响应 selector 方法:
func changeTextView() {
// 当 textView 改变的时候做出响应
print("textView 改变")
}
复制代码
2.使用自己定义的观察 name ,示例:name 为 shake 的NSNotification
NotificationCenter.default.addObserver(self, selector: #selector(change), name: NSNotification.Name(rawValue: "shake"), object: nil)
复制代码
这是就要根据需求发布通知了。 // 发布通知
@IBAction func click(_ sender: UIButton) {
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "shake"), object: self)
}
复制代码
// 作出响应
func change() {
print("wocao")
}
复制代码
3.携带信息,可用于传递数据
NotificationCenter.default.addObserver(self, selector: #selector(me), name: NSNotification.Name(rawValue:"me"), object: nil)
复制代码
发布有数据的消息,如果用于传递数据的话,这个方法就放在传值的界面:
@IBAction func click(_ sender: UIButton) {
NotificationCenter.default.post(name: NSNotification.Name(rawValue:"me"), object: self, userInfo: ["y" : "杨泓毅"])
}
复制代码
作出相应,获取发布的数据,放在接受值得界面:
func me(noti: Notification) {
let titles = noti.userInfo
self.navigationItem.title = titles?["y"] as? String
}
复制代码
最后别忘记移除观察者:
1.NotificationCenter.default.removeObserver(self)
2.NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue:"shake"), object: nil)
3.NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue:"me"), object: nil)
复制代码