SwiftUIの@StateObjectでの主要オブジェクトの保持の場所にハマる
SwiftUIでアプリを構成しなおしているときに、スクロールビューに配列が表示されなくなり、丸一日悩みました。
ObservedObjectの場合
ObservedObjectの場合、はじめに@StateObjectでインスタンス化させるのは親ビューだと聞いていたので、@StatateObjectを@mainのStruct Appでもたせていました。
ところが、ObservedObjectで@Publised変数として操作していた配列をスクロールビューとして表示するはずのビュで何故か表示されませんでした。
データをトレースしていっても原因が全然わかず、いろいろ実装していくうちに、@mainから呼ばれるビューの方で@StateObjectをもたせるとうまく表示に至りました。
そんなもんなんですかね。
EnvironmentObjectの場合
EnvironmentObject、すなわちビュー全体で共有するオブジェクトについては、どうやら@mainで@StateObjectとしてインスタンス化し.environmentObject(インスタンス名)として環境(ビュー)に注入する必要があるようです。
共有するオブジェクト側はObservedObjectのままでよく、共有するビュー側で@EnvironmentObjectとして宣言するようです。
複数のビューで共有するオブジェクトがある場合は、記述を簡略化する上でEnvironmentObjectとして利用するのがよさげです。
つぶやき
どうやら、@ObservedObjectとして1つのオブジェクトを複数のビューで利用するのはいろいろと問題がありそうです。知らんけどw
ちなみにビューの更新に関わるものではなく、かつビューだけでえなくクラスでも使うオブジェクトについては、シングルトンとして生成して管理する(DataManagerなど)のが良さげです。
この記事が気に入ったらサポートをしてみませんか?