作为更大表单的一部分,我希望有一个带有列表的部分,其条目可以重新排序。
在整个视图中,应该只能编辑该特定列表,而不能编辑其他内容。因此我希望将编辑按钮放在列表附近。
如果我只是将 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) { /* ... */ }
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我将 EditButton 包装在 HStack 中以在右侧显示按钮,则点击“编辑”会将按钮的标题更改为“完成”,但不再启动列表的编辑模式:
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) { /* ... */ }
}
Run Code Online (Sandbox Code Playgroud)
正如代码所示,我还尝试将 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)
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1965 次 |
最近记录: |