【SwiftUI】編集モードの取得に関する不具合

編集モード(editMode)の取得に関する不具合と思われる現象に遭遇したので、対処方法と一緒に記録を残しておきます。

スポンサーリンク

環境

この記事の情報は次のバージョンで動作確認しています。

【Xcode】12.5RC
【Swift】5.4
【iOS】14.5
【macOS】Big Sur バージョン 11.1
スポンサーリンク

ケース1

環境変数のeditModeを参照し、Editボタンが押されたら、Text表示が切り替わるサンプルソースです。

Editボタンが押されると、表示が切り替わります。
これは想定通りの動きです。

ケース1

スポンサーリンク

ケース2

ケース1と同じ機能をNavigationViewを使って再現します。
Editボタンは、NavigationBarに配置します。

こちらはEditボタンが押されても表示が切り替わりません。

ケース2

スポンサーリンク

対処方法

原因は不明ですが、NavigationViewのクロージャー内で、編集モードの取得がうまくできないようです。

以前に、現在では非推奨の.navigationBarItems()を使っていた時には、こちらの回避策がつかえましたが、.toolbar()使用時には有効ではありません。

代わりに次のようにしてこの問題を回避します。

対処の方法としては、次の通りです。

①独自の editMode 状態変数をState変数として定義します。
②定義したState変数を環境変数 .editModeに設定します。

.enviroment()はNavigationViewの中で、環境変数にアクセスする他のViewよりも後ろに追加するようにして下さい。

これで期待通り、表示が切り替わるようになりました。

原因と対処方法

スポンサーリンク

参考リンク

SwiftUI and the Intermittent EditMode
Fixing another common environment issue in SwiftUI.
スポンサーリンク

あわせて読みたい記事

【SwiftUI】Viewの編集モード(editMode)について
(2020/11/03 更新)Viewの編集モードについて解説します。
【SwiftUI】Viewの分割
(2020/03/10 更新)複雑なViewを小さなViewに分割する事で、繰り返しを避け、ソースを見やすくする方法を紹介します。Viewを分割してもパフォーマンスに大きな影響を及ぼさないのがSwiftUIの特徴の一つです。
【SwiftUI】Listの行削除
(2021/05/9 更新)Listで生成したデータ一覧の行削除処理について解説します。
スポンサーリンク
SwiftUI
カピ通信