『簡易說明Xcode』資料傳遞(Notification方式)
Notification除了可以傳送資料以外,也可以只通知,不傳送資料。例如當使用者輸入時,發出預設的鍵盤按鍵聲音,因此並不需要傳送資料,而只需要通知程式使用者按下鍵盤就好。一般應用在往回傳送資料使用,而不是向下個頁面傳送資料,因為需要先註冊,因此下個頁面還沒註冊,所以並不會接收資料,簡單來說就是發送通知前,必須先註冊完成。
Notification的特色如下:
- Notification一次可以傳資料給多個Controller。
- Notification隨時可以傳送資料。
Notification的使用方式如下:
註冊Notification的方式:
主要是使用addObserver()來註冊,主要有四個參數,分敘如下:
- observer:當Notification發生時,要通知的對象(Controller)。
- aSelector:當Notification發生時,通知的對象所呼叫的方法(Method)。
- aName:Notification的名稱(這必須與發送通知(Post),裡面的aName一樣)。
- anObject:這是設定是否接收特定的物件的通知。如設定nil,則就是不論哪個物件傳送的通知都收,若有設定物件,則只收這物件所發出的通知。
發送Notification的方式:
主要是使用post()來發送,主要有三個參數,分敘如下:
- aName:Notification的名稱(這必須與註冊(addObserver),裡面的Name一樣)。
- anObject:發送物件的Object name。如註冊端有設定接收特定的物件,那就必須設定這Object name,不然就設定nil即可。
- aUserInfo:可以透過aUserInfo這參數,將資料回傳到註冊畫面。aUserInfo為一個Dictionary。
移除Notification的方式:
當Controller死亡時會自動移除該Controller內註冊的Notification,不需要自己移除,系統會自動移除。如需要移除Notification則可以呼叫removeObserver來移除要移除的Observer。
範例說明:
建立Page1ViewController.swift與Page2ViewController.swift兩個Controller,在Page1ViewController使用addObserver()註冊Notification,在Page2ViewController使用Post(),發送Notification給在Page1ViewController所註冊的Notification。
傳送資料的Notification的方式:
Step1:在Page1ViewController.swift宣告 一個struct來儲存資料,因為範例只需要聲音的字串,所以只宣告一個字串常數。
Step2:在Page1ViewController.swift的viewDidLoad()註冊Notification。
Step3:在Page1ViewController.swift的Page1ViewController內建立收到通知後要執行的Method。因為註冊時是用#selector來指定Method,所以需要加@objc。
Step4:在Page2ViewController.swift中extension Notification.Name。extension Notification.Name可以避免打錯字,還有的好處就是容易閱讀。
Step5:因為Notification並不會返回之前的頁面,所以利用Navigation Controller的Back回到上一頁。所以在Page2ViewController.swift的viewWillDisappear()發送Notification。利用userInfo回傳要發出的聲音字串。
不傳送資料的Notification的方式:
因為Notification並不會返回之前的頁面,所以利用Unwind Segue回到上一頁,並發出通知。
Step1:在Page1ViewController.swift建立一個Unwind Segue的標記,當返回時執行播聲音。
Step2:在Page2ViewController.swift利用Button按下,呼叫發送Notification。因為不傳送資料所以可以使用post(name aName: NSNotification.Name, object anObject: Any?)發送。