Skip to content

实现列表的编辑模式:移动与删除

启用列表编辑模式

在 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
  • onDeleteonMove 修饰符必须直接应用于 ForEach 视图。
  • deleteItemmoveItem 方法中,直接操作你的 @State 数组。

本站使用 VitePress 制作