SwiftUI-编辑列表 List

261 阅读2分钟

在 SwiftUI 中,List 是一个用于显示可滚动列表的视图,可以展示一组数据。

List 提供了丰富的功能来展示、编辑和管理列表项。

以下是关于 List 的使用以及如何编辑列表项的详细介绍。

使用 List

List 用于展示一系列相同类型的视图,并支持滚动。

基本用法
struct ContentView: View {
    let items = ["Apple", "Banana", "Cherry"]
    var body: some View {
        List(items, id: \.self) { item in
            Text(item)
        }
    }
}
  • items:一个数组,其中包含要在列表中显示的项目。
  • id: .self:指定列表项的唯一标识符,.self 表示使用数组中的元素自身作为标识符。
使用自定义视图

你可以在列表中使用自定义视图:

struct ContentView: View {
    let items = ["Apple", "Banana", "Cherry"]
    var body: some View {
        List(items, id: \.self) { item in
            HStack {
                Image(systemName: "fruit.apple.fill")
                Text(item)
            }
        }
    }
} 

编辑列表

SwiftUI 提供了几种方法来实现对列表项的编辑,包括删除、移动和插入项。

删除项

要实现删除操作,你需要将列表与 onDelete 修饰符结合使用。你还需要一个可变的集合来存储列表项,以便在删除时更新数据源。

struct ContentView: View {
    @State private var items = ["Apple", "Banana", "Cherry"]
    var body: some View {
        List {
            ForEach(items, id: \.self) { item in
                Text(item)
            }
            .onDelete(perform: delete)
        }
        .navigationTitle("Fruits")
    }

    func delete(at offsets: IndexSet) {
        items.remove(atOffsets: offsets)
    }
}
  • .onDelete(perform:):指定删除操作的处理函数。
  • delete(at:):处理删除操作的方法,从数据源中移除指定的项。
移动项

要实现移动操作,你可以使用 onMove 修饰符。

struct ContentView: View {
    @State private var items = ["Apple", "Banana", "Cherry"]

    var body: some View {
        NavigationView {
            List {
                ForEach(items, id: \.self) { item in
                    Text(item)
                }
                .onMove(perform: move)
            }
            .navigationTitle("Fruits")
            .toolbar {
                EditButton()
            }
        }
    }
  
    func move(from source: IndexSet, to destination: Int) {
        items.move(fromOffsets: source, toOffset: destination)
    }
}
  • .onMove(perform:):指定移动操作的处理函数。
  • move(from:to:):处理移动操作的方法,调整数据源中的项的位置。
插入项

虽然 List 本身不直接支持插入项,但你可以通过更新数据源来实现插入操作。

struct ContentView: View {
    @State private var items = ["Apple", "Banana", "Cherry"]
    @State private var newItem = ""

    var body: some View {
        NavigationView {
            VStack {
                List {
                    ForEach(items, id: \.self) { item in
                        Text(item)
                    }
                }
                .navigationTitle("Fruits")
                HStack {
                    TextField("New item", text: $newItem)
                    Button("Add") {
                        if !newItem.isEmpty {
                            items.append(newItem)
                            newItem = ""
                        }
                    }
                }
                .padding()
            }
        }
    }
} 
  • TextField:用于输入新项的文本。
  • Button:用于将新项添加到列表中。

使用 List 与 NavigationLink

List 可以与 NavigationLink 结合使用,实现导航到详细视图的功能。

struct ContentView: View {
    let items = ["Apple", "Banana", "Cherry"]

    var body: some View {
        NavigationView {
            List(items, id: \.self) { item in
                NavigationLink(destination: DetailView(item: item)) {
                    Text(item)
                }
            }
            .navigationTitle("Fruits")
        }
    }
}

struct DetailView: View {
    let item: String
    var body: some View {
        Text("Detail view for \(item)")
            .navigationTitle(item)
    }
}
  • NavigationLink:用于在列表项中实现导航。

小结:

  • List:用于显示滚动列表。
  • .onDelete(perform:):实现删除操作。
  • .onMove(perform:):实现移动操作。
  • TextField和Button:实现插入项。
  • NavigationLink:用于导航到详细视图。

这些功能使得在SwiftUI中创建和管理列表变得简单高效。