我正在尝试使用 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/