すごいハマって時間を浪費したのでメモ。
【現象】
unwindSegueでTableViewControllerから元の画面へ戻って値を渡そうとした際に、tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)で共通変数に値を入れて値渡しをしようとしても、あれ?値が渡せない。。って状態になった。
【原因】
メソッドの実行順として、didSelectRowAtIndexPathはprepareForSegueやunwindSegueで呼び出される処理よりも後に実行されるため
【検証】
以下のように画面Aから画面Bへ戻る場合を想定。
準備したメソッドは以下のとおり。
(A)ViewController.swift
@IBAction func exitFromTableView(segue: UIStoryboardSegue){
println("exitFromTableView (unwindSegue)")
}
*戻ってくる際のunwindSegue用のメソッド
(B)TableViewController.swift
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
println("prepareForSegue")
}
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
println("didSelectRowAtIndexPath")
}
これでTableViewCellをクリックするとログはこのように出力される。
まとめると、以下の順番でメソッドは実行されるので
実装する際は注意しよう。
- prepareForSegue
- unwindSegueで呼ばれるメソッド
- Cellがクリックされた時のdidSelectRowAtIndexPathのメソッド
おわり。