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など)のが良さげです。


この記事が気に入ったらサポートをしてみませんか?