TableViewの画面遷移と値渡し
iOS 10.1 Xcode 8.0 Swift 3.0.2
一つ目のViewControllerにTableViewを作成し終わっていることを前提として説明し始めます。まだな人はここを参考にするといいかもしれません。ここではTableViewのCellを選択した際に画面遷移させる方法と、また同時に選択されたCellの情報を渡す方法を解説します。
右下のLiblaryからViewControllerを引っ張ってきて貼り付けます。それにCellから引っ張ってきて紐付けをします。
ここではとりあえずShowを選択してください。ここのSelection SegueのSegueとは画面遷移のことを指します。そして2枚目のViewControllerのClassを新しくClassファイルを作成してこれを設定します。ここではとりあえずSecondViewControllerとします。
ここまでは以前詳しく解説したので駆け足で通り抜けました。
ViewControllerとSecondをつなぐSegueを選択しidentifierをつけます。
そしてViewController.swiftを編集して行きます。ここが今回のSegueのメインテーマになります。
古い情報ではprepareForSegue関数を使っていましたが、私の環境では使用できなかったのでprepare()を使います。機能はprepareForSegueと同じでSegueされる際に呼び出されることになります。if segue.identifier == "segue1"{}はこのprepare()はどのようなSegueでも呼び出されるのでidentifierを識別することで正しい代入が行われるようにしています。
print()は後々呼び出される順番を見極めるために使用しました。
resultは 配列[indexPath.row]の選択されたものを一時的に保管するための変数になります。
secondViewController.recievedはSecondViewController.swiftに書いたcellの情報を受け取るための変数です。
prepare()をViewControllerクラスの中に書いてCellの結果をSecondViewControllerクラスのreceivedに代入してあげれば完了ですが、resultにCellの選択結果を代入してあげるタイミングがdidSelectRowAtが呼び出される時だとすでにprepare()が呼び出されています。すなわちsecondのviewDidLoad()に間に合わなくなってきます。
なのでこの場合代入するタイミングはdidHighlightRowAtとなります。
tableView.deselectRow()を実行することでTableのハイライトが解除されます。(これをしておかないと審査の時に落とされるそうです)
self.dismiss()を実行することで元いたView(この場合ViewController)に戻れます。私はBarにその機能をつけました。