iT邦幫忙

2021 iThome 鐵人賽

DAY 5
0
Mobile Development

在 iOS 開發路上的大小事系列 第 5

【在 iOS 開發路上的大小事-Day05】透過閉包 (Closure) 來傳值

前情提要

一般我們在做傳值動作的時候,會有好幾種方式可以做,像是用 Segue、Closure、Delegate、Global Variable、Notification 等方式,每種都有不同的應用場景,所以就依情況來使用~

前面已經有介紹過 GlobalVariable、Segue 傳值了

今天要介紹的是閉包 (Closure) 傳值

我們要做的是將第一個畫面上的 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


上一篇
【在 iOS 開發路上的大小事-Day04】透過 Segue 來傳值
下一篇
【在 iOS 開發路上的大小事-Day06】透過 Delegate 來傳值
系列文
在 iOS 開發路上的大小事30

尚未有邦友留言

立即登入留言