ベルマークのない自由帳

ベルマークのない自由帳

有益と無益の境界例

iOSアプリ開発メモ No.10 -ViewController間のデータのやり取り-

ViewController1で変数に入れた値をViewController2で引き継いで使いたい。
Googleで調べると以下のようなものがでてきました。
 
・Ex.swiftを作成してその中にグローバル変数を置く

・AppDeligate.swiftに変数を置く

・Segueを扱うメソッドで渡す

 
私は直感的だったSegueを扱うメソッドでViewController1からViewController2の変数を指定して値を渡す方法を選びました。
が、おかげで苦労しました。
おすすめは1番分かりやすうAppDeligatesのやつです。
 

解決法

ViewController1にあるtextBox変数の中身(文字列)をViewController2textInfo変数に渡したい場合、
 
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?){
        var ViewController2 = segue.destinationViewController as! ViewController2
        ViewController2.textInfo = textBox.text
    }

 

とすれば変数内のデータを渡せると上記のサイトで書いてあったので実行。
(正直overrideとかas!とかよく分かってないけど、そのへんはまあいいでしょう)
 
すると見事にエラーが出ました。
(右下のは変数定義してないだけなので関係ないです)
Method does not override any method from its superclass
ということは「親のクラスにこんなメソッドないんだけど?」と言っているわけですね。
 

f:id:Mantra:20180214212749p:plain

 
「サイトにこう書いてあるやんけー、だまくらかしおってー」
と初心者な私は思ってしまうのです。
 

解決法の解決法

更に調べてみるとQiitaのコミュに同じエラーで質問している人がいました。

 
つまり「そりゃバージョンアップで変更されるわな。しっかり公式のドキュメント読みんしゃい」ということです。
 
公式ドキュメントへ…。
ドキュメント内でCmd+F「Segue」と入力してみると
ありました。
若干変わっていて紛らわしいことこの上ないですが、こいつに違いありません。
 
そんなこんなで、現在のバージョン(Xcode 9.2)ではSegueを扱うメソッドを用いてViewController間でデータをやり取りするには
 
    override func prepare(for segue: UIStoryboardSegue, sender: Any?){
        var ViewController2 = segue.destination as! ViewController2
        ViewController2.textInfo = textBox.text
    }

 

 
こんな感じになります。
 
英語だからってものぐさせず、公式ドキュメントをチェックしなくちゃだめですねー。