list - 如何在 SwiftUI 的列表中启用选择

标签 list selection swiftui

我正在尝试使用 SwiftUI 创建一个简单的多选列表。我无法使它工作。

List 接受第二个参数,它是一个 SelectionManager,所以我尝试创建一个的具体实现。但是,它永远不会被调用,并且行永远不会突出显示。

import SwiftUI

var demoData = ["Phil Swanson", "Karen Gibbons", "Grant Kilman", "Wanda Green"]

struct SelectKeeper : SelectionManager{
    var selections = Set<UUID>()

    mutating func select(_ value: UUID) {
        selections.insert(value)
    }

    mutating func deselect(_ value: UUID) {
        selections.remove(value)
    }

    func isSelected(_ value: UUID) -> Bool {
        return selections.contains(value)
    }

    typealias SelectionValue = UUID

}

struct SelectionDemo : View {
    @State var selectKeeper = SelectKeeper()

    var body: some View {
        NavigationView {
            List(demoData.identified(by: \.self)){ name in
                Text(name)
            }
                .navigationBarTitle(Text("Selection Demo"))
        }
    }
}

#if DEBUG
struct SelectionDemo_Previews : PreviewProvider {
    static var previews: some View {
        SelectionDemo()
    }
}
#endif

代码运行良好,但行不突出显示,并且永远不会调用 SelectionManager 代码。

最佳答案

编辑模式

如上一个答案中所述,您可以在编辑模式下添加它。这意味着用户必须在某些时候按下编辑按钮来选择行。如果您想为列表设置 View 状态和编辑状态,这很有用。

var demoData = ["Phil Swanson", "Karen Gibbons", "Grant Kilman", "Wanda Green"]

struct SelectionDemo : View {
    @State var selectKeeper = Set<String>()

    var body: some View {
        NavigationView {
            List(demoData, id: \.self, selection: $selectKeeper){ name in
                Text(name)
            }
            .navigationBarItems(trailing: EditButton())
            .navigationBarTitle(Text("Selection Demo \(selectKeeper.count)"))
        }
    }
}

常量编辑模式

您也可以简单地保持编辑模式始终打开。 SwiftUI 具有环境修饰符,允许您手动控制任何环境变量。在这种情况下,我们要控制 editMode多变的。

var demoData = ["Phil Swanson", "Karen Gibbons", "Grant Kilman", "Wanda Green"]

struct SelectionDemo : View {
    @State var selectKeeper = Set<String>()

    var body: some View {
        NavigationView {
            List(demoData, id: \.self, selection: $selectKeeper){ name in
                Text(name)
            }
// the next line is the modifier
            .environment(\.editMode, .constant(EditMode.active))
            .navigationBarTitle(Text("Selection Demo \(selectKeeper.count)"))
        }
    }
}

关于list - 如何在 SwiftUI 的列表中启用选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56706188/

相关文章:

c - 如何制作通用链表

javascript - 嵌套节点 javascript 中的插入符索引

drop-down-menu - Vaadin 8 NativeSelect更改列表的数据表示形式

javascript - 在不使用 contenteditable 的情况下防止选择在 Firefox 的 iframe 中变灰

swift - 调用SwiftUI的#11,#12处的额外参数

list - Codetity与 `DList`和 `[]`之间的关系

python - 将列表的每个元素变成一个单独的字符串?

macos - 在新窗口中打开 View 的按钮 SwiftUI 5.3 for Mac OS X

swift - 如何使用 UIViewControllerRepresentable 在 SwiftUI 中呈现 UICollectionView

python - 如何将混合维数组展平为二维列表?