編集モード(editMode)の取得に関する不具合と思われる現象に遭遇したので、対処方法と一緒に記録を残しておきます。
環境
この記事の情報は次のバージョンで動作確認しています。
【Xcode】11.4.1
【Swift】5.2
【iOS】13.4.1
【macOS】Catalina バージョン 10.15.4
【Swift】5.2
【iOS】13.4.1
【macOS】Catalina バージョン 10.15.4
ケース1
環境変数のeditModeを参照し、Editボタンが押されたら、Text表示が切り替わるサンプルソースです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
struct ContentView: View { /// Viewの編集モードを取得 @Environment(\.editMode) var envEditMode var body: some View { VStack { EditButton() /// 編集モードによって表示を変える if envEditMode?.wrappedValue.isEditing ?? false { Text("編集モードON") } else { Text("編集モードOFF") } Spacer() } .font(.largeTitle) } } |
Editボタンが押されると、表示が切り替わります。
これは想定通りの動きです。
ケース2
ケース1と同じ機能をNavigationViewを使って再現します。
Editボタンは、NavigationBarに配置します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
struct ContentView: View { /// Viewの編集モードを取得 @Environment(\.editMode) var envEditMode var body: some View { NavigationView { VStack { /// 編集モードによって表示を変える if envEditMode?.wrappedValue.isEditing ?? false { Text("編集モードON") } else { Text("編集モードOFF") } Spacer() } .font(.largeTitle) .navigationBarItems(trailing: EditButton()) } } } |
こちらはEditボタンが押されても表示が切り替わりません。
原因と対処方法
原因はわかりませんが、いろいろと検証したところ、「NavigationViewのクロージャー内で、編集モードの取得ができない」ようです。
(※NavigationViewだけでなく、Formでも同様の現象が発生します。)
対処としては、Viewを分割して編集モードを参照する処理とNavigationViewの記述を分けると問題を回避できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
struct ContentView: View { var body: some View { NavigationView { SubView() .navigationBarItems(trailing: EditButton()) } } } struct SubView: View { /// Viewの編集モードを取得 @Environment(\.editMode) var envEditMode var body: some View { VStack { /// 編集モードによって表示を変える if envEditMode?.wrappedValue.isEditing ?? false { Text("編集モードON") } else { Text("編集モードOFF") } Spacer() } .font(.largeTitle) } } |
Editボタンが押されると、表示が切り替わるようになりました。
あわせて読みたい記事
【SwiftUI】Viewの編集モード(editMode)について
(2020/11/03 更新) Viewの編集モードについて解説します。
【SwiftUI】Viewの分割
(2020/03/10 更新) 複雑なViewを小さなViewに分割する事で、繰り返しを避け、ソースを見やすくする方法を紹介します。 Viewを分割してもパフォーマンスに大きな影響を及ぼさないのがSwiftUIの特徴の一つです。
【SwiftUI】Listの行削除
(2021/09/26 更新) Listで生成したデータ一覧の行削除処理について解説します。