Mac 如何在 SwiftUI 中制作带有过滤字段的列表
How to make a list with a filter field in SwiftUI on Mac
我正在尝试构建一个对话框,用户可以在其中 select 来自(当前)四个列表中的一个或多个列表。由于每个列表的结构相似,我正在构建一个将由每个列表使用的视图。列表可能有数千个条目,所以我想允许用户通过在搜索字段中键入内容(在 SwiftUI 中只是一个 TextField)来过滤列表,并且只显示匹配的条目。这一切都与下面的代码一起工作,但我不能 select 列表中的一行。
struct RegistryEntry: Equatable, Identifiable, Hashable {
var id = UUID()
var code = ""
var name = ""
var other = ""
}
struct RegistryPicker: View {
@State var sourceList: [RegistryEntry]
@State var searchString = ""
@State var selectedCode: String
@State private var selectedItem: RegistryEntry?
var body: some View {
HStack() {
VStack() {
TextField("Filter", text: $searchString)
Spacer()
}
List(searchString == "" ? sourceList :
sourceList.filter { [=11=].name.localizedCaseInsensitiveContains(searchString) },
selection: $selectedItem) { entry in
Text(entry.name)
}
}
}
我仍然在思考向 SwiftUI 的范式转变,所以我很可能遗漏了一些明显的东西。
更进一步,我需要将 selected 项目传递到对话框,最好将初始 selection 发送到列表。我假设这是通过使 selection 绑定到封闭视图中的适当状态变量并设置 selection 来完成的,大概是在 .onAppear 子句中。也欢迎任何指点!
事实证明,将“id:.self”添加到列表中是缺少的。该文档暗示如果内容符合 Identifiable,则不需要,但除非您明确添加标识符键路径,否则选择不起作用。
我正在尝试构建一个对话框,用户可以在其中 select 来自(当前)四个列表中的一个或多个列表。由于每个列表的结构相似,我正在构建一个将由每个列表使用的视图。列表可能有数千个条目,所以我想允许用户通过在搜索字段中键入内容(在 SwiftUI 中只是一个 TextField)来过滤列表,并且只显示匹配的条目。这一切都与下面的代码一起工作,但我不能 select 列表中的一行。
struct RegistryEntry: Equatable, Identifiable, Hashable {
var id = UUID()
var code = ""
var name = ""
var other = ""
}
struct RegistryPicker: View {
@State var sourceList: [RegistryEntry]
@State var searchString = ""
@State var selectedCode: String
@State private var selectedItem: RegistryEntry?
var body: some View {
HStack() {
VStack() {
TextField("Filter", text: $searchString)
Spacer()
}
List(searchString == "" ? sourceList :
sourceList.filter { [=11=].name.localizedCaseInsensitiveContains(searchString) },
selection: $selectedItem) { entry in
Text(entry.name)
}
}
}
我仍然在思考向 SwiftUI 的范式转变,所以我很可能遗漏了一些明显的东西。
更进一步,我需要将 selected 项目传递到对话框,最好将初始 selection 发送到列表。我假设这是通过使 selection 绑定到封闭视图中的适当状态变量并设置 selection 来完成的,大概是在 .onAppear 子句中。也欢迎任何指点!
事实证明,将“id:.self”添加到列表中是缺少的。该文档暗示如果内容符合 Identifiable,则不需要,但除非您明确添加标识符键路径,否则选择不起作用。