ビギグラマーのノート

自作PCやプログラミングについてのブログです。

TableViewの画面遷移と値渡し

iOS 10.1 Xcode 8.0 Swift 3.0.2

 一つ目のViewControllerにTableViewを作成し終わっていることを前提として説明し始めます。まだな人はここを参考にするといいかもしれません。ここではTableViewのCellを選択した際に画面遷移させる方法と、また同時に選択されたCellの情報を渡す方法を解説します。 

 右下のLiblaryからViewControllerを引っ張ってきて貼り付けます。それにCellから引っ張ってきて紐付けをします。

f:id:BegiGrammer:20161224231659p:plain

ここではとりあえずShowを選択してください。ここのSelection SegueのSegueとは画面遷移のことを指します。そして2枚目のViewControllerのClassを新しくClassファイルを作成してこれを設定します。ここではとりあえずSecondViewControllerとします。

f:id:BegiGrammer:20161224232320p:plain

ここまでは以前詳しく解説したので駆け足で通り抜けました。

ViewControllerとSecondをつなぐSegueを選択しidentifierをつけます。

f:id:BegiGrammer:20161224232730p:plain

そしてViewController.swiftを編集して行きます。ここが今回のSegueのメインテーマになります。

f:id:BegiGrammer:20161224232920p:plain

古い情報ではprepareForSegue関数を使っていましたが、私の環境では使用できなかったのでprepare()を使います。機能はprepareForSegueと同じでSegueされる際に呼び出されることになります。if segue.identifier == "segue1"{}はこのprepare()はどのようなSegueでも呼び出されるのでidentifierを識別することで正しい代入が行われるようにしています。

print()は後々呼び出される順番を見極めるために使用しました。

resultは 配列[indexPath.row]の選択されたものを一時的に保管するための変数になります。

secondViewController.recievedはSecondViewController.swiftに書いたcellの情報を受け取るための変数です。

f:id:BegiGrammer:20161224233839p:plain

 

prepare()をViewControllerクラスの中に書いてCellの結果をSecondViewControllerクラスのreceivedに代入してあげれば完了ですが、resultにCellの選択結果を代入してあげるタイミングがdidSelectRowAtが呼び出される時だとすでにprepare()が呼び出されています。すなわちsecondのviewDidLoad()に間に合わなくなってきます。

なのでこの場合代入するタイミングはdidHighlightRowAtとなります。

 tableView.deselectRow()を実行することでTableのハイライトが解除されます。(これをしておかないと審査の時に落とされるそうです)

 self.dismiss()を実行することで元いたView(この場合ViewController)に戻れます。私はBarにその機能をつけました。