Closureを理解するため、簡単なサンプルを作成中です。
FirstViewControllerのnextButtonでSecondViewControllerへ画面遷移
↓
SecondViewControllerのcountButtunを押すと数字が足されてcountLabelに反映
↓
SecondViewControllerのaddButtonでFirstViewControllerに戻る
この挙動でcountLabel(SecondViewController)の値をクロージャーを用いて
label(FirstViewController)に渡したいのですがうまくいきません。
FirstViewController
1import UIKit 2 3class FirstViewController: UIViewController { 4 5 let second = SecondViewController() 6 7 @IBOutlet weak var label: UILabel!{ 8 didSet{ 9 label.text = "0" 10 11 } 12 } 13 14 15 @IBAction func nextButton(_ sender: UIButton) { 16 17 let secondStoryboard = UIStoryboard(name: "Second", bundle: nil) 18 let secondVC = secondStoryboard.instantiateInitialViewController() as!SecondViewController 19 20 let nav = self.navigationController! 21 nav.pushViewController(secondVC, animated: true) 22 second.tap { CountModel in 23 print("ーーーー渡されたよーーーーーーー") 24 self.label.text = CountModel.count.description 25 } 26 27 28 } 29 30 override func viewDidLoad() { 31 super.viewDidLoad() 32 33 } 34 35} 36
SecondViewController
1import UIKit 2 3class SecondViewController: UIViewController{ 4 5 6 private var countmodel = CountModel.init(count: 0) 7 8 @IBOutlet weak var countLabel: UILabel!{ 9 didSet{ 10 countLabel.text = countmodel.count.description 11 } 12 } 13 14 @IBAction func countButtun(_ sender: UIButton) { 15 countmodel.count = countmodel.count + 1 16 countLabel.text = countmodel.count.description 17 print(countmodel) 18 } 19 20 21 @IBAction func addButton(_ sender: Any) { 22 tap() 23 self.navigationController?.popViewController(animated: true) 24 25 } 26 27 //クロージャー関数 28 func tap(completion:((CountModel)->Void)? = nil){ 29 print("tapしたよ") 30 print(countmodel) 31 completion?(CountModel(count: countmodel.count)) 32 } 33 34 override func viewDidLoad() { 35 super.viewDidLoad() 36 37 } 38 39 40 } 41
CountModel
1import Foundation 2 3struct CountModel { 4 var count:Int 5} 6
以上がコードです。
playground上での簡単なクロージャーのサンプルは理解できるのですが
実際に非同期処理でなぜ値が渡らないかが分かりません。
どなたかよろしくお願いいたします。
>非同期処理でなぜ値が渡らないかが分かりません
「非同期処理」とはどういう意味でしょうか?
ただSecondViewControllerにprotocolをつけて、値をdelegateを通してFirstViewControllerに渡せばいいのでは?
回答1件
あなたの回答
tips
プレビュー