作为更大表格的一部分,我希望有一个带有列表的栏目,其条目可以重新排序。
在整个视图中,应该只能编辑该特定列表,而不能进行其他操作。因此,我想在列表附近放置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) { /* ... */ }
}
但是,如果我将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) { /* ... */ }
}
正如代码所示,我还尝试将editMode环境变量传递给HStack,但没有任何帮助。
有什么方法可以使HStack中的EditButton正常工作吗?
(备注:由于列表是较大窗体的一部分,因此按我建议的here将EditButton置于Section之外)。
答案 0 :(得分:1)
这是有效的解决方案-看起来他们要求EditButton是section的根视图,因此我们可以在其上方构造其他所有内容。 (已通过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)
}