iOS app — 跨頁傳遞資料

segue, prepare, unwind, notification, autolayout

場景一

說明:點選列表頁tableView的cell,連到內容頁,再從內容頁返回

實作

  1. 從列表頁tableView cell壓ctrl拉線到內容頁controller,建立segue
  2. 在列表頁override func prepare,判斷目前選取的是哪個row後,將內容頁的controller設定為segue.destination,修改內容頁的book變數為目前選中的books[row]資料
  3. 在內容頁的viewDidLoad顯示book資料。之後從內容頁透過navigation controller返回列表頁

場景二 (unwind)

說明

  • step1:點選列表頁tableView cell 上面的edit1按鈕,連到編輯頁1顯示資料。
  • step2:在編輯頁1修改資料後點擊save按鈕,返回列表頁並顯示編輯後的資料(透過prepare/unwind的方式回傳資料)。

實作step1

  1. 從列表頁controller拉線到edit1TableViewController,建立segue,並將segue命名為editStory1
  2. 列表頁edit1 button建立@IBAction func edit1Clicked,把這個@IBAction也連到其他edit1 button,撰寫func內容去執行performSegue。
    註:performSegue被觸發時,會觸發prepare func
  3. 修改prepare func,判斷當segue.identifier == 建立的segue名稱時,設定segue.destination為編輯頁controller,並且設定編輯頁controller的book資料。透過button tag的值,程式可以知道用戶所點的是哪一筆資料。
  4. 在編輯頁1的viewDidLoad顯示資料

實作step2

  1. 在edit1TableViewController override func prepare,設定book資料為用戶修改後的資料
  2. 在列表頁新增@IBAction func unwind1ToList(segue: UIStoryboardSegue)
  3. 在編輯頁storyboard放置save按鈕,ctrl拉線連到編輯頁controller的exit,選擇unwind1ToListWithSegue,建立一條unwindSegue
  4. 在列表頁實作func unwind1ToList,將列表頁book資料設定為編輯頁book資料

場景三 (notification)

說明

  • step1:點選列表頁tableView cell 上面的edit2按鈕,連到編輯頁2顯示資料。
  • step2:在編輯頁2修改資料後點擊save按鈕,返回列表頁並顯示編輯後的資料(透過notification的方式)。
  • 註:notification概念是觀察者模式(Observer Pattern),當事件觸發時進行廣播,由事先註冊好的觀察者來接收訊息(有點類似消息訂閱)

實作step1:與場景二實作step1相同原理

實作step2

  1. 列表頁建立observer
     NotificationCenter.default.addObserver
  2. 編輯頁2在viewWillDisappear時,發出notification
  3. 在列表頁建立空的@IBAction func unwind1ToList(segue: UIStoryboardSegue),在編輯頁2將save button連到controller,讓save button點選時可以回到列表頁
  4. 列表頁實作notification被觸發時的func內容@objc func updateBookNoti,更新畫面內容

Notification的優點

  1. 可以遠距離傳資料,例如從第五個controller將資料傳回第一個controller
  2. 可以一次傳資料給多個人
  3. 任何時候都可以傳資料。unwind segue 只能在viewWillDisappear時傳
  4. notification不只可以傳資料,可以應用在某件事情發生時產生通知,接著做某件事情。