『簡易說明Xcode』資料傳遞(使用Prepare傳遞Property的方式)

頁面之間的資料傳遞,有許多不同的方式,接下來是簡單說明一下使用Property將資料傳遞到下一個畫面,也就是另一個Controller。

使用Segue連接兩個Controller,如利用Button連結到下一個頁面。再利用override func prepare(for segue: UIStoryboardSegue, sender: Any?)傳遞到下一個頁面。而func prepare()在建立File時就會自動建立好,只是被註解(Mark)了,所以移除註解就可以使用。注意func prepare()必須有Segue才會觸發

func prepare()是在經由Segue進入下一個頁面前會被觸發,所以要傳遞什麼資料可以在func prepare()內處理,所以執行順序是現在頁面的func prepare()先執行,再執行下一個頁面的func viewDidLoad()。所以要注意一點就是頁面的Controller要不一樣,不過一般來說不同頁面就會有不同的Controller.swift。

而要如何到取得下一個頁面呢?那就是要靠segue.destination來指定了, 例如let controller = segue.destination as? InstructionsViewController,而 InstructionsViewController就是要跳到的Controller。

那接下來就是要知道,如何跳到不同的Controller,因為一個畫面上可能會連結到不同的頁面,因此就會有多個Segue,所以就需要Segue的Identifier來命名Segue,透過判斷Segue名稱來決定要傳送哪些資料到下一個頁面。

因此在func prepare()內利用Segue的ID來區分,segue.identifier就是程式裡接收剛剛在Storyboard所設定的Segue的Identifier,因此可以利用這個判斷要跳到哪個Controller。例如:man跳到ManViewController,woman跳到womanViewController。因為這次的練習,沒有用到多個不同Controller畫面呈現,所以在範例程式碼中並沒有。

一般來說傳送資料到下一個畫面時,有三個方法:

  • 宣告多個Property
  • Property的型別為 Dictionary
  • Property的型別為自訂型別

在範例中,因為商品資料眾多,所以一般來說不會宣告多個 property,通常是使用自訂型別,然後將自訂型別的資料傳送過去,讓下一個頁面顯示不同的商品介紹。然而為什麼不用Dictionary呢?因為Dictionary是由key (索引) 和 value (資料)為一組所組成,然而範例中需要傳遞的是三個Property,所以使用了自訂型別。

因為範例使用的是Table View來顯示商品列表,所以可以使用tableView.indexPathForSelectedRow?.row來取得被選到的是哪個商品。將segue.destination as? InstructionsViewController存到controller這常數中,所以可以透過controller來給下一個畫面的資料,因此自訂型別的資料可以存到controller?.變數,而這個變數就是下一個畫面宣告的變數。

而這邊為什麼要透過下一個頁面的變數,再去修改畫面呢?而不是直接修改ImageView或是Label呢?因為ImageView或是Label都是透過@IBOutlet連結的,因此在prepare()時controller雖然已經建立,但是@IBOutlet連線還未建立,所以無法使用,如果使用則會閃退Crash。所以要注意不要在prepare()時設定@IBOutlet。

所以在下一個頁面的func viewDidLoad()更新畫面時需要利用變數或是自訂型別的變數。

因為範例是用Table View來顯示商品列表,所以在程式內func numberOfSections()與func tableView()需要註解,因為Static Cells由 Storyboard來控制Cell的數量,不需從程式控制,如不註解,則會因為回傳0,則無法顯示商品列表,變成一片空白。

--

--