HStack中的SwiftUI EditButton无法激活编辑模式

时间:2020-08-10 11:47:44

标签: swiftui

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

在整个视图中,应该只能编辑该特定列表,而不能进行其他操作。因此,我想在列表附近放置EditButton。

如果仅将EditButton设置为Section标头,则可以对List项进行重新排序,但无法显示section标题:

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) { /* ... */ }
}

enter image description here

但是,如果我将EditButton包裹在HStack中以显示右侧的按钮,则轻按“编辑”会将按钮的标题更改为“完成”,但不再启动List的编辑模式:

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) { /* ... */ }
}

enter image description here

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

有什么方法可以使HStack中的EditButton正常工作吗?

(备注:由于列表是较大窗体的一部分,因此按我建议的here将EditButton置于Section之外)。

1 个答案:

答案 0 :(得分:1)

这是有效的解决方案-看起来他们要求EditButton是section的根视图,因此我们可以在其上方构造其他所有内容。 (已通过Xcode 11.4 / iOS 13.4测试)

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

demo

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)
}