一般我們在做傳值動作的時候,會有好幾種方式可以做,像是用 Segue、Closure、Delegate、Global Variable、Notification 等方式,每種都有不同的應用場景,所以就依情況來使用~
前面已經有介紹過 GlobalVariable、Segue 傳值了
我們要做的是將第一個畫面上的 TextField 裡的值傳到第二個畫面的 TextView 上
畫面設計這裡就不示範了,大家就自己設計就可以了
首先我們在 MainVC.swift 裡先設計一個 Function,定義這個 Closure 要來接收第一個畫面上 TextField 的值
// 透過閉包 (closure) 來傳值
func closureSendValue(_ handler: (String) -> Void) {
guard let text = textField.text else { return }
handler(text)
}
這邊宣告了一個 handler 的變數,型別為 (String) -> Void,也就是 Closure
我們給了一個 String 的接收值跟 Void 的回傳值 (也就是無回傳值)
並讓 Closure 透過 text 來接收 TextField 的值
接著在 SecondVC.swift 裡先宣告一個變數 mainVC 型別為 MainVC,然後在需要用到的地方來呼叫剛剛在 MainVC.swift 裡定義的 Closure,這邊是示範在 viewDidLoad 裡呼叫,然後將值顯示在 TextView 上
var mainVC: MainVC?
override func viewDidLoad() {
super.viewDidLoad()
mainVC?.closureSendValue({ text in
textView.text = text
})
}
在 MainVC.swift 跳頁按鈕的 Action Function 裡加入下方的程式碼 (有寫註解的那行)
@IBAction func pushToSecondVC(_ sender: UIButton) {
let vc = SecondVC(nibName: "SecondVC", bundle: nil)
vc.mainVC = self // 加入這一行,將 SecondVC 裡的 mainVC 指向 MainVC 這個檔案
self.navigationController?.pushViewController(vc, animated: true)
}
本篇的範例程式碼:GitHub
參考資料:https://reurl.cc/O0gv33