swift 在TabView中无法识别editMode更改

von4xj4u  于 11个月前  发布在  Swift
关注(0)|答案(4)|浏览(91)

这段代码在不在TabView中时工作得很好。一旦它被放在TabView中,.editMode的更改似乎对List没有任何影响。

struct ContentView: View {
    @Environment(\.editMode) var editMode
    var body: some View {
        TabView {
            myView().tabItem {
             Text("test")
            }.tag(0)
        }
    }
}
struct myView : View {
    @State var list = ["a", "b", "c"]
    @Environment(\.editMode) var editMode

    var body: some View {
        VStack {
            Button(action: {
                if self.editMode?.wrappedValue == .active {
                    self.editMode?.wrappedValue = .inactive
                } else {
                    self.editMode?.wrappedValue = .active
                }
            }, label: {
                Text("Edit")
            })
            List {
                ForEach(list, id:\.self) {val in
                    Text(val)
                }.onDelete(perform: { indexSet in
                    ()
                })
            }
        }
    }
}

字符串
不确定这是一个bug,还是.editModeTabView中有什么不同。

nbewdwxp

nbewdwxp1#

您可以显式地注入editMode

struct myView: View {
    @State var list = ["a", "b", "c"]
    @Environment(\.editMode) var editMode

    var body: some View {
        VStack {
            Button(action: {
                if self.editMode?.wrappedValue == .active {
                    self.editMode?.wrappedValue = .inactive
                } else {
                    self.editMode?.wrappedValue = .active
                }
            }, label: {
                Text("Edit")
            })
            List {
                ForEach(list, id: \.self) { val in
                    Text(val)
                }.onDelete(perform: { indexSet in
                    ()
                })
            }
            .environment(\.editMode, editMode) // <- inject here
        }
    }
}

字符串

esbemjvw

esbemjvw2#

你可以通过添加EditButton来切换列表视图的编辑模式

struct ContentView: View {
   @State var list = ["a", "b", "c"]

   var body: some View {
      NavigationView {
          List {
              ForEach(list, id: \.self) { value in
                  Text(value)
              }
              .onDelete(perform: delete)
          }
          .navigationBarItems(trailing: EditButton())
      }
  }

  func delete(at offsets: IndexSet) {
     list.remove(atOffsets: offsets)
  }
}

字符串

xe55xuns

xe55xuns3#

尝试使用EditButton()而不是创建普通的Button
这对我很有效:

VStack {
  EditButton()
  List {
   ForEach(list, id:\.self) {val in
     Text(val)
   }.onDelete(perform: { indexSet in
     ()
   })
  }
 }

字符串

eit6fx6z

eit6fx6z4#

创建一个自定义的EditMode变量并将其注入到相关的子视图中(包括EditButton,以避免滚动您自己的视图)可以解决这个问题。

在iOS 17.2上测试

Example GIF

import SwiftUI

struct EditButtonTabView: View {
  @State private var editMode = EditMode.inactive
  var body: some View {
    TabView {
      NavigationStack {
        List {
          ForEach(1...5, id: \.self) { number in
            Text(String(number))
          }
          .onDelete { _ in
            // Delete action
          }
        }
        .environment(\.editMode, $editMode)
        .toolbar {
          EditButton()
            .environment(\.editMode, $editMode)
        }
      }
      .tabItem {
        Label("Home", systemImage: "house")
      }
    }
  }
}

字符串

相关问题