使用SwiftData搜索结果

ohfgkhjo  于 2023-09-30  发布在  Swift
关注(0)|答案(2)|浏览(130)

我有一个对象数组,我可以在SwiftUI视图中呈现。将它们显示为List非常简单,但是我想创建部分并按元素的属性之一分组。
我尝试使用Dictionary(grouping:by:),然后按字典的键排序以获得部分,但这会减慢UI。感觉我做错了什么。

List {
                ForEach(myArray.keys.sorted(), id: \.self) { mySection in
                    Section(header: Text(mySection)) {
                        ForEach(myArray[mySection] ?? []) { element in
                            NavigationLink {
                                DetailView(element: element)
                            } label: {
                                ElementRow(element: element)
                            }
                        }

                    }
                }
            }

有没有比Dictionary(grouping:by:)更有效的方法来将从SwiftData检索的数据分组到节中?

h9a6wy2h

h9a6wy2h1#

对于分组数据,请尝试使用OutlineGroup,而不是List
您可能需要将数据转换为组,这可以在父View主体中的计算属性中完成,您可以在其中初始化包含OutlineGroupView

cgvd09ve

cgvd09ve2#

我在GitHub上找到了一个名为SectionedQuery的框架,它完全满足了我的需求:

@State private var searchTerm = ""

    @SectionedQuery(sectionIdentifier: \MyObject.id ,
                        sortDescriptors: [
        SortDescriptor(\MyObject.property1),
        SortDescriptor(\ MyObject.property2)
    ],
           animation: .smooth
    )
    var sections

    // stuff

    List {
        // my list consuming sections
    }
    .searchable(text: $searchTerm)

为了将它与 predicate 一起使用,我做了以下操作:

List {
    // list code
}
.searchable(text: $searchTerm)
.onChange(of: searchTerm) {
    togglePredicate()
}

func togglePredicate() {
    guard !searchTerm.isEmpty else {
        sections.predicate = nil
        return
    }

    sections.predicate = #Predicate<MyThing> {
        $0.someProperty.localizedStandardContains(searchTerm)
    }
}

相关问题