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反向傳值的流程。

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

Henry Huang
Henry Huang

Written by Henry Huang

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

No responses yet

Write a response