在SwiftUI列表中选择多个项目

Bra*_*ley 5 swiftui

在UIKit中,您可以使用allowMultipleSelection选择UITableView的多行-可以使用SwiftUI中的List完成吗?

Jev*_*les 12

首先将其添加到您的视图中

@State var selectedItems = Set<UUID>()
Run Code Online (Sandbox Code Playgroud)

的类型Set取决于您使用的id:项目的类型ForEach

接下来声明列表

List(selection: $selectedItems) {
    ForEach(items, id: \.id) { item in
        Text("\(item.name)")
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,您选择的任何内容都会添加到 selectedItems 中,Set请记住在使用后将其清除。


gra*_*ell 11

现在,在SwiftUI中获取多重选择的唯一方法是使用EditButton。但是,这不是您可能要使用多重选择的唯一实例,如果您EditButton实际上没有尝试编辑任何内容时使用了多重选择,则可能会使用户感到困惑。

我认为您真正要寻找的是这样的东西:

在此处输入图片说明

以下是我为此创建的代码:

struct MultipleSelectionList: View {
    @State var items: [String] = ["Apples", "Oranges", "Bananas", "Pears", "Mangos", "Grapefruit"]
    @State var selections: [String] = []

    var body: some View {
        List {
            ForEach(self.items, id: \.self) { item in
                MultipleSelectionRow(title: item, isSelected: self.selections.contains(item)) {
                    if self.selections.contains(item) {
                        self.selections.removeAll(where: { $0 == item })
                    }
                    else {
                        self.selections.append(item)
                    }
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
struct MultipleSelectionRow: View {
    var title: String
    var isSelected: Bool
    var action: () -> Void

    var body: some View {
        Button(action: self.action) {
            HStack {
                Text(self.title)
                if self.isSelected {
                    Spacer()
                    Image(systemName: "checkmark")
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


sim*_*bac 5

我创建了一个自定义ToggleStyle如下:

import SwiftUI


enum Fruit: String, CaseIterable, Hashable {
    case apple = "Apple"
    case orange = "Orange"
    case banana = "Banana"
}

struct ContentView: View {

    @State var fruits = [Bool](repeating: false, count: Fruit.allCases.count)

    var body: some View {
        Form{
            ForEach(0..<fruits.count, id:\.self){i in
                Toggle(isOn: self.$fruits[i]){
                    Text(Fruit.allCases[i].rawValue)
                }.toggleStyle(CheckmarkToggleStyle())
            }
        }
    }
}

struct CheckmarkToggleStyle: ToggleStyle {
    func makeBody(configuration: Self.Configuration) -> some View {
        HStack {
            Button(action: { withAnimation { configuration.$isOn.wrappedValue.toggle() }}){
                HStack{
                    configuration.label.foregroundColor(.primary)
                    Spacer()
                    if configuration.isOn {
                        Image(systemName: "checkmark").foregroundColor(.primary)
                    }
                }
            }
        }
    }
}

Run Code Online (Sandbox Code Playgroud)