【teratail】Labelに文字列を代入するコードでThread1: Fatal errorが発生

 

質問

 

teratail.com

 

実現したいこと

 

下記のセルをタップしたら、

・2つのラベルテキスト

・曲のアイコン画

を、

 

f:id:nekokichi_yos2:20180929225934p:plain

 

次画面の

・Label

・ImageView

に渡したい。

 

f:id:nekokichi_yos2:20180929225945p:plain

 

困っていること

 

次画面へ遷移する際の処理を記述するprepareメソッドの

playvc.songnameLabel.text = “a”

(playvcとは次画面のインスタンス

で、

Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value

が発生してしまう。

 

label.textがnilが原因だと思い、次画面で紐付けしたlabel.textにviewDidLoad()で値を代入してもダメ。

 

解決方法

 

prepareは遷移する際に処理されるメソッドなので、prepareを通過した時にはまだ次画面のlabelは生成されていない。

 

言い換えると、viewが生成されてない。

 

方法は2つ。

 

1つは、次画面でテキストを受け取る変数を宣言しておくこと。

 

例えば、

var labelText = “”

と宣言し、viewDidLoad()で

playvc.labelText = labelText

と記述すればいい。

 

そもそも次画面で紐付けされるlabelに直接値を代入するのは無理だった。

 

2つ目は、prepare内に

_ = playvc.view

と記述すればいい。

 

viewが生成すれば、次画面のlabelにアクセスできる。

 

しかし、なんやかんやの理由で、1つめの方法が望ましい。

 

結論として、画面を超えた値の受け渡しは、受け取るがわに変数を用意しておく必要がある。