#30 Transfer data between View Controller

今天來紀錄一下新技能,在 View Controller 間傳遞資料,選用了心理測驗當主題,心理測驗的資料來源是 Oh.Oh.Olive 的插畫加上 Esra 的專欄,那就開始吧~

Copy from “https://www.adaymag.com/2020/03/30/esra-little-golden-mouse.html?fb”.

Target

  1. 練習使用 IBSegueAction 在 View Controller 之間傳遞資料

Process

還記得之前的電子書練習,如果一個畫面有不一樣的地方就要重新拉一個 ViewController 來設計,現在已經不需要囉,今天練習的重點就是判斷使用者點選的是哪一個 UI 元件,將資訊傳到下一頁,下一頁的 ViewController 會根據傳來的資料決定要呈現哪些資料給使用者看。

先來看一下這次 Storyboard的畫面,相當的整潔,只有兩個頁面,一頁是主頁,有四個選項可以選擇,另一頁是呈現結果的頁面,根據使用者的選項呈現對應的內容。畫面如此簡潔主要歸功於今天要記錄的新功能,IBSegueAction。

IBSegueAction ,顧名思義就是從 Segue 拉出來的 Action。

拉出來後,Type 下方可選擇 None, Sender 和 Sender and Identifier,Sender 指的就是觸發 Segue 的元件,Identifier 是我們可以為每條 Segue 命名以方便辨識。

@IBSegueAction func showResult(_ coder: NSCoder, sender: UIButton, segueIdentifier: String?) -> ResaultViewController? {let controller = ResultViewController(coder: coder)controller?.resultIndex = sender.tagreturn controller}

由於這次觸發 Segue 的元件是 UIButton,再拉出 IBSegueAction 後,可把 sender 後面的 Any? 改為 UIButton,這樣就可以直接使用 sender 取得 UIButton 的相關資訊了。

在這個例子中,我將四個 UIButton 的 tag 設置成 0, 1, 2, 3,在第二頁的 ResultViewController 創建 Array ,將第一頁的 UIButton.tag 的值傳到第二頁,當作 resultIndex 的值,來決定給使用者看到的資訊。

操作畫面如下 GIF 檔給大家參考囉,也一併附上 GitHub 連結在最下方~

--

--