Swift 3.0 Class Note – 轉場(segue, storyboard reference) 與 資料傳遞, Generic

Presenter : Wei Wei

轉場

  • Storyboard上的ViewController,class是連結到swift檔案中的class,而非整個檔案,因為同名,容易混淆,也就是同一個swift檔,可定義多個class給不同的ViewController,也可以分開用多個swift檔來管理
  • XIB 就像是stroyboard的前身
  • 五種轉場方式(換到下個畫面)
    1. 從item直接拉segue到目的地
    2. 從Controller拉segue到目的地
      • seque給定identifier
      • 拉item action,再用perform segue指定用哪個segue
      • 使用時機:某個Controller的畫面,多種情況會觸發,只要在storyboard設計一次,再從程式觸發
      • 注意事項:傳入不存在的Storyboard會crash
      • 例子:檔案的Go to View 2 & Got to View 2-1 Button
    3. 用程式碼觸發,不用拉segue
      • 先找到目的地的storyboard,UIStoryboard(name: “Main", bundle: nil)
      • 目的地的Controller填上storyboard ID :myStorybard.instantiateViewController(withIdentifier: “redview")
      • 再用present or push的方式來轉場
      • 回到前一畫面dismiss(vs. present) or pop(vs. push)
      • 回到第一個畫面popRoot
      • 注意事項:由上而下或由左往右切換,似乎進入和回來都要同一種,不然沒辦法切換
      • 例子:檔案的Go to View 3 & Back Button 、Go To New View(跨storyboard)
    4. storyboard reference
      • storyboard reference,填入目的地Storyboard & Reference ID
      • 例子:Go To Yellow Button
    5. 執行逃生門(unwind Segue)
      • 目的地畫面的ViewController寫好@IBAction func functionName (_segue: UIStoryboardSegue)
      • 來源畫面拉上一Button,並跟來源畫面storyboard頂部的exit連結上
      • 例子:檔案的Back To Main Button

github : git@github.com:dan12411/HelloNavigationController.git

資料傳遞

  • 資料傳到下一頁的方法:用prepare(for segue)方法,給定segue.identifier & destionationViewController
  • 四種資料回傳的方法
    1. 利用protocol (最常見的做法):觸發條件 – 按下Back按鈕
      • 設定一個protocol
      • 第二個畫面ViewController產生delegate
      • 讓第一個畫面ViewController當delegate
      • 服從此protocol
      • 第一個畫面ViewController & 第二個畫面ViewController的媒介底下實作function(setColor)
      • 相較於Callback的優點:you can create a base class that conforms to the protocol delegate and avoid code redundancy
      • 相較於Callback的缺點:delegation is harder to implement
    2. 執行逃生門方法 by unwind Segue (很酷的方法):觸發條件 – 按下Back To Main按鈕
      • 目的地畫面的ViewController寫好@IBAction func functionName (_segue: UIStoryboardSegue)
      • 來源畫面拉上一Button,並跟來源畫面storyboard頂部的exit連結上
      • 目的地個畫面用@IBAction下用segue.source as? SecondViewController跟第二個畫面要資料
      • 實作function(setColor)
    3. Notification (通知中心):觸發條件 – viewWillDisappear(SecondViewController),使用時機 – 同時要通知多個ViewController時,比較方便
      • SecondViewController在viewWillDisappear底下寫code
      • 一樣先得到被選的顏色
      • 發出通知NotificationCenter.default.post
      • ViewController設置接收通知後要做的事
      • ViewController在viewDidLoad設置接收器addObsever
      • ViewController拆除接收器deinit{…removeObsever}
      • 優點:不需要編寫多少代碼、簡單實現1對多的方式,相較於 Delegate 可以實現更大的幅度的通信、能够傳遞參數(object和userInfo)
      • 缺點:編譯期間不會檢查通知是否能够被觀察者正確的處理、需要在通知中心移除觀察者、通知名稱不一致,會出現不同步的情况、測試的时候,通知傳遞的過程很難控制和跟踪、不能從觀察者獲得任何的回饋信息
    4. AppDelegate (萬佛朝宗的概念):觸發條件 – viewWillAppear(ViewController)
      • 藉由UIApplication.shared.delegate as? AppDelegate傳值
      • 用到Class Method & singlton的觀念

more : iOS: Three ways to pass data from Model to Controller

  • 讓鍵盤跳出來:myTextfield.becomeFirstResponder()

  • 讓鍵盤掉下去:myTextfield.resignFirstResponder()

  • 05781322-058F-4B0C-9B09-C33B4C02645E-85338-00016F525E02E73D.gif

    Generic(泛型)

  • 定義出一個適用任意型別的函式及型別。可以避免重複的程式碼且清楚的表達程式碼的目的
  • 陣列(Array)和字典(Dictionary)都是泛型的。
  • 額外觀念:輸入輸出參數(inout)

ref : Swift 起步走 – 泛型、函式

螢幕快照 2016-10-07 下午1.02.29.png

 

廣告

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s