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不只可以傳資料,可以應用在某件事情發生時產生通知,接著做某件事情。
One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.