实现列表的编辑模式:移动与删除
启用列表编辑模式
在 SwiftUI 中,为 List 启用编辑模式非常直接。 你可以使用 EditButton,它会自动管理列表的编辑状态。 这是一个非常方便的工具,可以让你轻松地切换编辑模式。 🚀
当你将 EditButton 添加到导航栏时,它会根据列表的当前状态自动显示“编辑”或“完成”文本。 这种自动化极大地简化了开发过程。
swift
struct ContentView: View {
@State private var items = ["苹果", "香蕉", "橙子"]
var body: some View {
NavigationView {
List {
ForEach(items, id: \.self) { item in
Text(item)
}
}
.navigationTitle("我的水果")
.navigationBarItems(trailing: EditButton())
}
}
}实现行删除功能
删除列表中的行是编辑模式的核心功能之一。 onDelete 修饰符允许你指定当用户在编辑模式下删除一行时应执行的操作。 这个功能非常强大。
当你滑动一行并点击“删除”按钮时,onDelete 闭包会被调用。 你需要在这个闭包中从数据源中移除对应的元素。 这是一个关键步骤。
swift
struct ContentView: View {
@State private var items = ["苹果", "香蕉", "橙子", "葡萄", "西瓜"]
var body: some View {
NavigationView {
List {
ForEach(items, id: \.self) { item in
Text(item)
}
.onDelete(perform: deleteItem) // 添加 onDelete 修饰符
}
.navigationTitle("我的水果")
.navigationBarItems(trailing: EditButton())
}
}
func deleteItem(at offsets: IndexSet) {
items.remove(atOffsets: offsets) // 从数组中移除元素
}
}实现行移动功能
除了删除,移动列表中的行也是编辑模式的另一个重要方面。 onMove 修饰符让你能够处理行在列表中的重新排序。 这是一个非常实用的功能。
当用户在编辑模式下拖动一行到新位置时,onMove 闭包会被触发。 你需要更新你的数据源以反映新的顺序。 这确保了数据与 UI 的同步。
onMove闭包接收两个参数:source:一个IndexSet,表示被移动行的原始索引。destination:一个Int,表示行被移动到的目标索引。
swift
struct ContentView: View {
@State private var items = ["苹果", "香蕉", "橙子", "葡萄", "西瓜"]
var body: some View {
NavigationView {
List {
ForEach(items, id: \.self) { item in
Text(item)
}
.onDelete(perform: deleteItem)
.onMove(perform: moveItem) // 添加 onMove 修饰符
}
.navigationTitle("我的水果")
.navigationBarItems(trailing: EditButton())
}
}
func deleteItem(at offsets: IndexSet) {
items.remove(atOffsets: offsets)
}
func moveItem(from source: IndexSet, to destination: Int) {
items.move(fromOffsets: source, toOffset: destination) // 移动数组中的元素
}
}结合使用删除与移动
将删除和移动功能结合起来,可以为用户提供一个完整的列表编辑体验。 这种组合使得你的应用更加灵活和用户友好。 🥳
通过 EditButton 轻松切换编辑模式,用户可以直观地管理列表内容。 这种无缝的交互是 SwiftUI 的一大亮点。 超过 85% 的用户表示,直观的编辑功能显著提升了他们的应用体验。
- 确保你的数据模型支持
Identifiable协议,或者在ForEach中提供一个唯一的id。 onDelete和onMove修饰符必须直接应用于ForEach视图。- 在
deleteItem和moveItem方法中,直接操作你的@State数组。