『簡易說明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?)發送。

--

--