HStack中的SwiftUI编辑按钮未激活编辑模式

HStack中的SwiftUI编辑按钮未激活编辑模式,swiftui,Swiftui,作为更大表单的一部分,我希望有一个带有列表的部分,其条目可以重新排序 在整个视图中,应该只能编辑该特定列表,而不能编辑其他内容。因此,我希望列表附近有编辑按钮 如果我只是将EditButton设置为节标题,则可以对列表项进行重新排序,但无法显示节标题: struct ContentView: View { private let items = Range(1...4).map { "Item " + String($0) } var bo

作为更大表单的一部分,我希望有一个带有列表的部分,其条目可以重新排序

在整个视图中,应该只能编辑该特定列表,而不能编辑其他内容。因此,我希望列表附近有编辑按钮

如果我只是将EditButton设置为节标题,则可以对列表项进行重新排序,但无法显示节标题:

struct ContentView: View {
    
    private let items = Range(1...4).map { "Item " + String($0) }
    
    var body: some View {
        Form {
            Section(header: EditButton()) {
                ForEach(items, id: \.self) { item in
                    Text(item)
                }
                .onMove(perform: reorderItems)
                .onDelete(perform: deleteItems)
            }
        }
    }

    func reorderItems(from sourceIndices: IndexSet, to destinationIndex: Int) { /* ... */ }

    func deleteItems(at offsets: IndexSet) { /* ... */ }
}

但是,如果我将EditButton包装在HStack中以显示右侧的按钮,点击“Edit”(编辑)会将按钮标题更改为“Done”(完成),但不再启动列表的编辑模式:

struct ContentView: View {

    @Environment(\.editMode) var editMode
    
    private let items = Range(1...4).map { "Item " + String($0) }
    
    var body: some View {
        Form {
            Section(header: HStack {
                Text("Section title")
                
                Spacer()
                
                EditButton()
            }.environment(\.editMode, self.editMode)) {
                ForEach(items, id: \.self) { item in
                    Text(item)
                }
                .onMove(perform: reorderItems)
                .onDelete(perform: deleteItems)
            }
        }
    }

    func reorderItems(from sourceIndices: IndexSet, to destinationIndex: Int) { /* ... */ }

    func deleteItems(at offsets: IndexSet) { /* ... */ }
}

正如代码所示,我还尝试将editMode环境变量传递给HStack,但没有任何帮助

有没有办法让HStack中的EditButton正常工作


(备注:由于列表是一个更大表单的一部分,在我的情况下,将EditButton按建议放置在节之外不是一个选项。)

这是一个有效的解决方案-看起来他们要求EditButton是节的根视图,因此我们可以构建它上面的所有内容。(使用Xcode 11.4/iOS 13.4进行测试)

注意:
@Environment(\.editMode)var editMode
是不需要的


惊人的解决方案,工作完美!你似乎真的是速战速决之王!
Section(header:
    EditButton().frame(maxWidth: .infinity, alignment: .trailing)
        .overlay(Text("Header"), alignment: .leading)
)
{
    ForEach(items, id: \.self) { item in
        Text(item)
    }
    .onMove(perform: reorderItems)
    .onDelete(perform: deleteItems)
}