iOSアプリ開発メモ No.10 -ViewController間のデータのやり取り-
ViewController1で変数に入れた値をViewController2で引き継いで使いたい。
Googleで調べると以下のようなものがでてきました。
・Ex.swiftを作成してその中にグローバル変数を置く
・AppDeligate.swiftに変数を置く
・Segueを扱うメソッドで渡す
私は直感的だったSegueを扱うメソッドでViewController1からViewController2の変数を指定して値を渡す方法を選びました。
が、おかげで苦労しました。
おすすめは1番分かりやすうAppDeligatesのやつです。
解決法
ViewController1にあるtextBox変数の中身(文字列)をViewController2のtextInfo変数に渡したい場合、
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?){var ViewController2 = segue.destinationViewController as! ViewController2ViewController2.textInfo = textBox.text}
とすれば変数内のデータを渡せると上記のサイトで書いてあったので実行。
(正直overrideとかas!とかよく分かってないけど、そのへんはまあいいでしょう)
すると見事にエラーが出ました。
(右下のは変数定義してないだけなので関係ないです)
Method does not override any method from its superclass
ということは「親のクラスにこんなメソッドないんだけど?」と言っているわけですね。
「サイトにこう書いてあるやんけー、だまくらかしおってー」
と初心者な私は思ってしまうのです。
解決法の解決法
更に調べてみるとQiitaのコミュに同じエラーで質問している人がいました。
つまり「そりゃバージョンアップで変更されるわな。しっかり公式のドキュメント読みんしゃい」ということです。
公式ドキュメントへ…。
ドキュメント内でCmd+Fで「Segue」と入力してみると
ありました。
若干変わっていて紛らわしいことこの上ないですが、こいつに違いありません。
そんなこんなで、現在のバージョン(Xcode 9.2)ではSegueを扱うメソッドを用いてViewController間でデータをやり取りするには
override func prepare(for segue: UIStoryboardSegue, sender: Any?){ViewController2.textInfo = textBox.text}
こんな感じになります。
英語だからってものぐさせず、公式ドキュメントをチェックしなくちゃだめですねー。