『簡易說明Xcode』資料傳遞(使用IBSegueAction傳遞Property的方式)
不同頁面之間的資料傳遞,在之前有介紹過Prepare、Notification 或是Unwind segue的方式傳遞資料,但是在IOS 13之後的版本,又多了一個方式傳遞資料,那就是使用IBSegueAction。
你或許可以從字面上看得出來,IBSegueAction就因該是與Segue有關,而實際上就是利用Segue,來連結IBSegueAction所定義的函式(Function),當透過Segue切換頁面時,就會呼叫IBSegueAction所定義的函式(Function)。使用IBSegueAction需要注意這一點,就是當First Controller想要透過Segue傳遞資料到Second Controller,那就必須要在First Controller中定義 @IBSegueAction function,也就是IBSegueAction function 是定義在 Segue 起點的controller。
範例說明:
Step1:首先要在Storyboard拉兩個ViewController,一個background設為黃色,當做FirstViewController,另一個background設為藍色,當做SecondViewController。
Step2:然後建立FirstViewController.swift與SecondViewController.swift兩個Controller,將FirstViewController的Class指到FirstViewController而SecondViewController的Class指到SecondViewController。
Step3:然後再FirstViewController建立一個Button如下圖1,然後從Button拉一個Segue到SecondViewController,如下圖2,最後在SecondViewController建立一個Label,用來顯示從FirstViewController傳遞的資料如圖3。
Step4:點選Adjust Editor Options(如下圖1),然後點選顯示 Assistant 頁面(如下圖2),這邊需要注意的是,右邊需要切換成顯示 Segue 起點的 controller,也就是FirstViewController.swift。
Step5:點選 Segue,將 Segue連線到FirstViewController程式,也就是從 Segue 拉線到FirstViewController.swift,產生IBSegueAction function,並將此action function取名為showData。這樣就可以在FirstViewController.swift看到會有showData的 @IBSegueAction function(如下圖1)、First View Controller Scene看到Show segue to “ Second View Controller”(如下圖2)與Storyboard Segue的Selector看到ShowData:(如下圖3)。
Step6:然後再從Storyboard中SecondViewController的Label與SecondViewController.swift拉一個 @IBOutlet,變數名叫resultLabel,用來顯示從FirstViewController傳來的字串。
Step7:並在SecondViewController.swift建立一個optional 字串型別的變數firstData,用來接收從FirstViewController傳遞過來的字串,並在viewDidLoad()內將firstData指定給resultLabel.text,將resultLabel的文字更新為FirstViewController傳遞過來的字串。
class SecondViewController: UIViewController { @IBOutlet weak var resultLabel: UILabel! var firstData:String? override func viewDidLoad() { super.viewDidLoad() resultLabel.text = firstData }
}
Step8:最後就是在FirstViewController.swift內showData的@IBSegueAction中,利用SecondViewController的產生一個controller,並將這controller的變數firstData設定為”This is first page data”,最後return這controller,就會將資料透過IBSegueAction傳遞到SecondViewController。
@IBSegueAction func showData(_ coder: NSCoder) -> SecondViewController? { let controller = SecondViewController(coder: coder) controller?.firstData = "This is first page data" return controller}