Henry Huang
3 min readDec 29, 2018

利用閉包反向傳值

反向傳值之前比較常用protocol,想說之後有機會用clouser來試試,所以先寫個簡單的樣式來試試看。

這個Demo有2個ViewController,OneViewController Embed NavigationController

OneViewController 有一個Button(轉到TwoViewController)跟一個Label(顯示傳回來的值)

TwoViewController有一個UITextField(用來輸入要回傳的文字)

流程是這樣:OneViewController轉到TwoViewController,在TwoViewController的輸入框輸入文字後,按NavigationController的back可回到OneViewController。

以下開始:

首先在要回傳值的TwoViewController創建一個clouser,使用typealias來給個別名,再創建一個var,型別是剛剛創的MyClouser

class TwoViewController: UIViewController {@IBOutlet weak var myTxt: UITextField!typealias MyClouser = (String) -> Voidvar myClouser: MyClouser?override func viewDidLoad() {super.viewDidLoad()}

在TwoViewController按下back後會回的到OneViewController,所以我在viewWillDisappear裡寫下以下程式碼,讓myTxt的值能回傳

override func viewWillDisappear(_ animated: Bool) {myClouser?(myTxt.text ?? "")}

接下來回到OneViewController,在myBtn的action裡接收閉包回傳的值並顯示在myLbl上,這樣就完成囉!

class OneViewController: UIViewController {@IBOutlet weak var myLbl: UILabel!override func viewDidLoad() {super.viewDidLoad()}@IBAction func myBtn(_ sender: UIButton) {if let twoViewController = storyboard?.instantiateViewController(withIdentifier: "TwoViewController") as? TwoViewController {twoViewController.myClouser = {  (str) -> Void in  self.myLbl.text = str  }navigationController?.pushViewController(twoViewController, animated: true)  } }}

以上就是一個簡單的Clouser反向傳值的流程。

Henry Huang
Henry Huang

Written by Henry Huang

大學讀企管/退伍後在業務圈打滾6年後突然有一天決定投入完全沒接觸過的程式設計/目前為一位iOS Developer/熱愛NBA/dafu1231@gmail.com

No responses yet