【SwiftUI】@StateにonAppearで代入しても反映されない(Xcode13、iOS15)

SwiftUI

SwiftUIでよく使用する@Stateですが宣言時に初期化しますが、
イニシャライザを作成して初期化しても無効化されます。
そこでよく使われていた方法がonAppearでの代入です。
onAppearを使う事で@Stateが初期化された後に値を入れ再描画する事ができます。

しかし同じコードでもXcode13、iOS15の環境下では、
onAppearでの代入では値が入ってはいても再描画が上手くされない場合がありました。

なお、私が開発していたアプリで起こりましたが、テスト用に作成したアプリでは起こりませんでした。
何か条件がある様ですが、詳しくは分からなかったため不安な箇所があれば確認するをお勧めします

※追記
Form内のTextFieldのtextに対して、SectionのonAppearはOKで、FormのonAppearはNGでした。
以前は両方問題なかったはずです。

対処法1

デフォルトイニシャライザで初期化する。
@State自作したイニシャライザでは初期化できませんが、デフォルトのものを使用すると初期化できます。
イニシャライザを作成していない場合は有効な手段です。無駄な再描画も省けます。

対処法2

前述の方法ではイニシャライザを作成した場合は使用できません。
また@Stateに@EnvironmentObjectからの値を使用する場合も、
ひとつ上のViewから渡す必要があり面倒です。

そんな場合はonAppearの位置を変更してみて下さい。
私の場合はZStackにつけていたonAppearをTextFieldに直接つける事で改善しました。

最後に

更新の度にある事とは思いますが、
Xcode13、iOS15に更新することでも挙動が変わることがあります。
よく確認することをお勧めします。

コメント

タイトルとURLをコピーしました