微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 Mac 上的 SwiftUI 中使用过滤器字段制作列表

如何解决如何在 Mac 上的 SwiftUI 中使用过滤器字段制作列表

我正在尝试构建一个对话框,用户可以在其中从(当前)四个列表中的一个或多个列表中进行选择。由于每个列表的结构相似,我正在构建一个将由每个列表使用的视图。列表可能有数千个条目,因此我希望允许用户通过在搜索字段(在 SwiftUI 中只是一个 TextField)中键入内容来过滤列表,并且只显示匹配的条目。这都适用于下面的代码,但我无法选择列表中的一行。

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 { $0.name.localizedCaseInsensitiveContains(searchString) },selection: $selectedItem) { entry in
            Text(entry.name)
        }
    }
}

我仍然在思考向 SwiftUI 的范式转变,所以我很可能会遗漏一些明显的东西。

更进一步,我需要将所选项目向上传递到对话框,并且最好将初始选择发送到列表。我假设这是通过将选择绑定到封闭视图中的适当状态变量并设置选择来完成的,大概是在 .onAppear 子句中。也欢迎任何指点!

解决方法

事实证明,将“id:.self”添加到列表中是缺失的。该文档暗示如果内容符合 Identifiable,则您不需要它,但除非您明确添加标识符键路径,否则选择不起作用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。