iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 26
0
自我挑戰組

打造專案管理 iOS App 系列 第 26

安能取熊掌而捨魚? 淺談觀察者模式

  • 分享至 

  • xImage
  •  

安能取熊掌而捨魚? 淺談觀察者模式

物件可以去向通知中心註冊,成為某一種通知事件的觀察者,然後當有人向通知中心送出通知的時候,通知中心就會去找它的註冊表裡面,所有有註冊這個通知類型的觀察者,並將通知傳送給它們。

觀察者模式是一個常見、而且歷史悠久的程式設計模式,而在 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/


上一篇
安能取熊掌而捨魚? Animation
下一篇
安能取熊掌而捨魚? 便捷初始化器語法
系列文
打造專案管理 iOS App 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言