物件可以去向通知中心註冊,成為某一種通知事件的觀察者,然後當有人向通知中心送出通知的時候,通知中心就會去找它的註冊表裡面,所有有註冊這個通知類型的觀察者,並將通知傳送給它們。
觀察者模式是一個常見、而且歷史悠久的程式設計模式,而在 Swift 裡,它主要是以通知與通知中心 (NotificationCenter) 的形式存在的。
看到下面這張圖片,這是註冊觀察者,常用的方法。
NotificationCenter.default.addObserver(觀察者, selector: #selector(觀察者用來處理通知的方法), name: 通知的名稱, object: 要觀察的對象物件)
通知中心用來辨別通知類型的方法,是透過它的名稱,所以你必須要找到相對應的名稱才行。官方框架的部分名稱是直接歸在 Notification.Name 這個命名空間底下,很好找,但有其它更多的名稱四散在各處,不看文件很難找得到。
接下來我們試著實作吧。
你應該不難發現,時常在編輯模式時,鍵盤會蓋住畫面的一部分,我們可以嘗試註冊觀察者,觀察鍵盤推出的事件。
註冊一個觀察者,這個觀察者就是自己(observer),觸發事件是 pushView , 通知的名稱是使用官方的框架,一般來說是使用Notification.Name 這個命名空間,不過鍵盤事件是在UIResponder這個命名空間。
observer.addObserver(self, selector: #selector(pushView), name: UIResponder.keyboardWillShowNotification, object: nil)
反之,畫面回推的功能。
observer.addObserver(self, selector: #selector(closeView), name: UIResponder.keyboardWillHideNotification, object: nil)
@objc func pushView(){
let animate = UIViewPropertyAnimator(duration: 0.25, curve: .easeInOut) {
self.view.center = CGPoint(x: ScreenSize.centerX.value, y: ScreenSize.centerY.value * 0.5)
}
animate.startAnimation()
}
@objc func closeView(){
let animate = UIViewPropertyAnimator(duration: 0.25, curve: .easeInOut) {
self.view.center = CGPoint(x: ScreenSize.centerX.value, y: ScreenSize.centerY.value )
}
animate.startAnimation()
}
https://www.appcoda.com.tw/notificationcenter/