回答編集履歴

3

説明を捕捉しました

2018/02/09 04:15

投稿

516k
516k

スコア189

test CHANGED
@@ -1,6 +1,6 @@
1
1
  ChatVC().nav.title
2
2
 
3
- のChatVC()でインスタンスを生成していますかね?その画面のインスタンスをコードから生成しても残念ながらアウトレット navは自動的に生成、接続はされません。
3
+ のChatVC()でインスタンスを生成していますかね?その画面のViewControllerのインスタンスをイニシャライザから生成しても残念ながらアウトレット navは自動的に生成、接続はされません。
4
4
 
5
5
  したがってnavはnilとなりこのクラッシュが発生します。
6
6
 
@@ -11,3 +11,13 @@
11
11
 
12
12
 
13
13
  delegateプロパティをchatVC型として扱えるようにしてそのnav.titleにDBの戻り値をセットすればうまくいくかもしれませんね。
14
+
15
+
16
+
17
+ ※補足ですがStoryBoardで作った画面のVCをコードからインスタンス化する場合は下記メソッドでインスタンス化するのが一般的かと思います。
18
+
19
+ ```Swift
20
+
21
+ let vc = storyboard.instantiateViewController(withIdentifier: "hogehoge")
22
+
23
+ ```

2

コードをよく読んだらなんとなくわかりました

2018/02/09 04:15

投稿

516k
516k

スコア189

test CHANGED
@@ -1,21 +1,13 @@
1
+ ChatVC().nav.title
2
+
1
- 画面遷移前後関係がわからないので的外れかもれませんが、思いがけずこのfatal errorが発生する場合は準備のできアウトレットにアクセスしている場合が極めて多いです
3
+ のChatVC()でインスタンスを生成していますかね?その画面のインスタンスをコードから生成しても残念がらアウトレット navは自動的生成、接続はされません
4
+
5
+ したがってnavはnilとなりこのクラッシュが発生します。
2
6
 
3
7
 
4
8
 
5
- 前の画面からチャット画面への遷移はstoryboardのセグエですかね?
6
-
7
- prepare for segue内で次の画面にデータ渡すのは定石ですが、そこで遷移先のアウトレットにアクセスが発生するとご指摘クラッシュおこります。
9
+ DBProviderクラスの役割分担が把握しきれておりませんが、chatVCのviewDidLoadから呼び出されるメソッド内もう一度chatVC生成して値をセットするのは違和感ります。
8
-
9
- このprepareの段階はインスタンスとして次のvcは生成されているが、アウトレットは接続されていない段階なのです。
10
10
 
11
11
 
12
12
 
13
- この場合ですとprepareメソッド内からnavigation itemに直接的、間接的にアクセスが発生するとクラッシュが発生します。他のアウトレットがもしあるならそれも同様です。
14
-
15
-
16
-
17
- 間接的というのは、値をセットするのは通常のプロパティでもそのプロパティオブザーブしてアウトレットに値を反映的な処理をているケースです
13
+ delegateプロパティをchatVC型として扱えるようしてそのnav.titleにDBの戻り値をセットすればうまくいくかもれませんね
18
-
19
-
20
-
21
- prepare for segueではデータをアウトレットとは完全に無関係なプロパティに渡すにとどめ、遷移先のVCのViewDidLoad以降のタイミングでそのプロパティからアウトレットに値を反映するようにすることでこの現象は解決できます。

1

補足します

2018/02/08 15:32

投稿

516k
516k

スコア189

test CHANGED
@@ -15,3 +15,7 @@
15
15
 
16
16
 
17
17
  間接的というのは、値をセットするのは通常のプロパティでもそのプロパティをオブザーブしてアウトレットに値を反映的な処理をしているケースです。
18
+
19
+
20
+
21
+ prepare for segueではデータをアウトレットとは完全に無関係なプロパティに渡すにとどめ、遷移先のVCのViewDidLoad以降のタイミングでそのプロパティからアウトレットに値を反映するようにすることでこの現象は解決できます。