gpt4 book ai didi

search - 有没有办法在初始化后使用谓词修改获取的结果?

转载 作者:行者123 更新时间:2023-12-03 19:20:52 24 4
gpt4 key购买 nike

我正在尝试为现有的 CoreData 应用程序(简单的日志记录应用程序)构建搜索 View 。
我使用 CoreData 存储所有数据,并使用 获取@FetchRequest :

@State private var searchPredicate: NSPredicate? = NSPredicate(format: "title contains[c] %@", "")

@FetchRequest( entity: Item.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \Item.title, ascending: true)],
predicate: NSPredicate(format: "title contains[c] %@", "h")
)
var items: FetchedResults<Item>

它现在只获取通过谓词测试的项目,在这种情况下是所有包含“h”的项目。
然后,我将结果显示在 SearchView 正文中的列表中:
List {

ForEach(Items) { Item in

ListViewItem(title: Item.title!, subTitle: Item.subTitle!, createdAt: "\(Item.createdAt!)")

}
}

然后我创建了一个新类“Searchbar”,它在搜索 View 中调用,应该根据搜索字段的输入创建一个谓词,然后将其作为绑定(bind)传递给父级,然后基于该谓词正确的项目可以显示。

在搜索 View 中调用 VStack 顶部的搜索栏:
SearchBar(text: $searchText, predicate: $searchPredicate)

绑定(bind)根据“searchBar”中的用户输入而变化:
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {

text = searchText
predicate = NSPredicate(format: "title contains[c] %@", searchText)

}

到现在为止还挺好...

我现在遇到的问题是我们有一个有效的谓词,但不能在定义中的 @Fetchrequest 中调用,因为它会在初始化之前被调用。
@State private var searchPredicate: NSPredicate? = NSPredicate(format: "title contains[c] %@", "")


@FetchRequest(
entity: Item.entity(),
sortDescriptors: [
NSSortDescriptor(keyPath: \Item.title, ascending: true)
],
predicate: searchPredicate
) var items: FetchedResults<Item>

这给了我一个错误,即在 self 可用之前无法运行属性初始化程序,这是合乎逻辑的,但让我想知道并让我回到我的问题: 有没有办法在初始化后使用谓词修改获取的结果?

我还尝试在 ForEach() 语句中对获取的结果调用谓词相关方法,但它们似乎都没有奏效。

如果有任何问题,请随时提问。

最佳答案

Is there a way to modify fetched results with a predicate after they are initialized?



嗯......不,不是你尝试这样做的方式,即使你尝试使用 NSFetchRequest 实例创建它,它是引用,并允许稍后更改谓词,这也行不通,因为 SwiftUI 的 FetchRequest存储提供的获取请求的副本(或使用提供的参数创建自己的)......所以,不。但...

您可以将提供获取请求参数的 View 与构造获取请求并显示结果的 View 分开。

这是一个方法演示(它的重要部分),它使您可以使用不同的动态更改谓词获得结果:
struct MasterView: View {
@State var predicate: NSPredicate? = nil
var body: some View {
VStack {
Button(action: { // button just for demo
self.predicate = NSPredicate(format: "title contains[c] %@", "h")
}, label: { Text("Filter") })
ResultView(predicate: self.predicate)
}
}
}

struct ResultView: View {

@FetchRequest
var events: FetchedResults<Event>

@Environment(\.managedObjectContext)
var viewContext

init(predicate: NSPredicate?) {
let request: NSFetchRequest<Event> = Event.fetchRequest()
request.sortDescriptors = [NSSortDescriptor(keyPath: \Event.timestamp, ascending: true)]
if let predicate = predicate {
request.predicate = predicate
}
_events = FetchRequest<Event>(fetchRequest: request)
}

var body: some View {
List {
ForEach(events, id: \.self) { event in
...

关于search - 有没有办法在初始化后使用谓词修改获取的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59344515/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com