100道iOSApp謎題 #78 利用 delegate 在 controller 間溝通 & 實作可增刪修的簡易記帳App
作業題目:
設計一個簡易記帳的App來練習TableView的CRUD,並練習用delegate在Controller之間傳遞資料:
建立兩個Custom Class:
左邊是記錄的列表,使用Dynamic cell,Class是ListTableViewController
右邊是記錄的細節,使用Static cell,Class是DetailTableViewController
(使用Dynamic cell要記得設定cell的Identifier)。
加入Bar Button Item:
ListTableViewController透過右下角 Embed In
加入Navigation Controller後,就可以放入 Bar Button Item:
DetailTableViewController要先從Library加入 Navigation Item
才能放入Bar Button Item:
建立Segue:
從ListTableViewController拉了兩條Segue到DetailTableViewController:一條是點選右上角新增記錄,另一條是點選Cell修改資料。
建立記錄的Struct:
利用Delegate在Controller之間溝通:
- 定義代理人protocol
2. 宣告一個property是delegate
3. 在要準備儲存資料的地方,透過property delegate去執行protocol宣告的function;也就是要透過代理人去執行更新資料的動作
呼叫popViewController回到上一個顯示的畫面:
4. 讓ListTableViewController去遵從DetailTableViewControllerDelegate的protocol
5. 在ListTableViewController裡要定義protocol中宣告的Function。也就是去定義更新資料要做的動作,一個是新增,一個是修改。
6. 最後就是要把DetailTableViewController的代理人設爲自己(ListTableViewController),透過segue可以得到DetailTableViewController的property,再把delegate設成自己(ListTableViewController)
若是點選cell要修改資料,則把資料傳過去;在DetailTableViewController的viewDidLoad中把傳過來的資料顯示出來。
所以透過Delegate在Controller之間溝通的流程會是:
- 在ListTableViewController點右上角+或cell時,會執行prepare for segue,在這裡將DetailTableViewController裏面的delegate設爲自己(ListTableViewController)
2. 進到DetailTableViewController輸入/修改資料後按下Save,會執行SaveButton,在這裡會呼叫delegate(也就是剛剛設的ListTableViewController)去執行update的動作,這個update動作的內容就是在ListTableViewController裏面定義的update