[Swift]クロージャで画面を閉じる時に値を受け渡す
FirstVC -> SecondVC に値を受け渡すのは以下です。
import UIKit
class FirstVC: UIViewController {
var num1: Int?
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func goSecondVC(_ sender: Any) {
let secondVC = storyboard?.instantiateViewController(withIdentifier: "SecondVC") as? SecondVC
if let secondVC = secondVC {
secondVC.num2 = 2 //値を受け渡す
present(secondVC, animated: true, completion: nil)
}
}
}
import UIKit
class SecondVC: UIViewController {
var num2: Int?
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func closeButton(_ sender: Any) {
dismiss(animated: true, completion: nil)
}
}
storyboardからSecondVCを取得して、そのプロパティに値をセットする方法です。
では、SecondVC -> FirstVC に戻る時に値を受け渡す時は、
storyboardからFirstVCを取得すると遷移前のFirstVCとは別に新しくインスタンスが作られ、遷移前のFirstVCは取得できません。
この問題を解決するのがクロージャです。
以下コードです。
import UIKit
class FirstVC: UIViewController {
var num1: Int?
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func goSecondVC(_ sender: Any) {
let secondVC = storyboard?.instantiateViewController(withIdentifier: "SecondVC") as? SecondVC
if let secondVC = secondVC {
secondVC.num2 = 2 //値を受け渡す
//SecondVCのclosureを定義
② secondVC.closure = {(num: Int) -> Void in
self.num1 = num
}
present(secondVC, animated: true, completion: nil)
}
}
}
import UIKit
class SecondVC: UIViewController {
var num2: Int?
① var closure: ((Int) -> Void)?
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func closeButton(_ sender: Any) {
③ closure?(1) //値を受け渡す
dismiss(animated: true, completion: nil)
}
}
① SecondVCにclosureプロパティを追加します。型は (Int) -> Void です。引数のIntに受け渡したい値をセットします。
② FirstVCで、SecondVCのclosureの処理を定義します。
③ 値を受け渡したい時にclosureを実行します。
これで値が受け渡されます。