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,则不需要,但除非您明确添加标识符键路径,否则选择不起作用。