利用閉包反向傳值
反向傳值之前比較常用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反向傳值的流程。