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

2024-03-25

我正在尝试为现有 CoreData 应用程序(简单的日志记录应用程序)构建搜索视图。 我将所有数据存储在 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”,它在搜索视图中调用,应该根据搜索字段的输入创建一个谓词,然后将其作为绑定传递给父级,然后根据该谓词创建正确的项目可以显示。

在搜索视图中调用 VStack 顶部的搜索栏:

SearchBar(text: $searchText, predicate: $searchPredicate)

绑定根据“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() 语句中获取的结果调用谓词相关方法,但它们似乎都不起作用。

如果有任何疑问,请随时询问。


有没有办法在获取的结果之后使用谓词修改它们 已初始化?

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

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

这是一个方法演示(它的重要部分),它使您可以通过不同的动态更改谓词获得结果:

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
    ...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有没有办法在初始化后使用谓词修改获取的结果? 的相关文章

  • 在 SwiftUI 中正确使用 Task { }

    我想了解正确的用法Task 在以下 SwiftUI 代码中 我的目标是获得基本的了解以避免内存泄漏 这是 SwiftUI 部分的示例代码 struct MyView View ObservedObject var viewModel Vie
  • 如何在elasticsearch中配置synonym_path

    我对 elasticsearch 很陌生 我想使用同义词 我在配置文件中添加了这些行 index analysis analyzer synonym type custom tokenizer whitespace filter synon
  • 在 Xcode11 Beta 4 中将 String(format: , args) 与 SwiftUI 一起使用时出错

    升级到 Xcode 11 Beta 4 后 我在使用时开始看到错误String format args with State财产 请参阅下面的代码 第二Text行抛出错误 表达式类型 String 在没有更多上下文的情况下不明确 while
  • 绑定到枚举的关联值

    是否有一个标准的方法来绑定 比如说 TextField到枚举的关联值 所以 鉴于此 enum Choice case one String case two String 我可以以某种方式将它用作视图中的绑定吗 State var choi
  • CoreData 获取孩子的父母

    我有一个one to many关系store lt gt gt product 并且我知道该产品 我如何才能找到该产品的父级是谁 例如 我可以拥有许多具有相同值的产品product1 has parent1以及具有相同值的另一种产品prod
  • SwiftUI macOS 在文本字段处于活动状态时使用箭头键滚动列表

    我想使用 SwiftUITextField https developer apple com documentation swiftui textfield和一个 SwiftUIList https developer apple com
  • 如何在 SwiftUI 中对 Imagepicker 进行两次单独的调用?

    我希望用户能够将两个单独的图像上传到同一视图的两个不同部分 我能够让第一张图像在顶部正确显示 但每当用户添加第二个图像时 顶部的图像会再次更新 而不是底部的图像 截屏 https i stack imgur com IOi90 png 下面
  • 在 SwiftUI (5) 和 Xcode (12.4) 中实现 AdMob 插页式广告

    我正在努力在我的应用程序中实现插页式广告 但对 AdMob 提供的文档和新的 SwiftUI 应用程序结构遇到了一些困惑 这里是app swift文件 显示我已经实现了 GoogleMobileAds 并在didFinishLaunchin
  • iOS 8 核心数据堆栈 - 致命错误:在解包可选值时发现 nil

    我对 iOS 开发比较陌生 决定实现自己的 Core Data 堆栈 替换 Apple 的默认堆栈 我必须对我的代码进行更改 显然 并且能够弄清楚它 但在这种情况下我不能 这是我的代码 import UIKit import CoreDat
  • Google 自定义搜索引擎未给出预期的搜索结果

    我一直在尝试创建一个新的谷歌自定义搜索引擎 但是当我尝试一些查询时 搜索引擎没有给我预期的搜索 结果 在某些查询上它工作正常 但在其他查询上 它说 没有结果 我尝试添加我想要搜索的网站的 URL 但是当我尝试搜索该页面的关键字时 某些页面和
  • 强制设置核心数据检查点?

    我编写了一个通过 Core Data 搅动大量数据的应用程序 用户在后台退出应用程序后 我会清理这些数据 由于 WAL 检查点似乎是导致 UI 暂停的主要原因 因此我还想强制使用 WAL 检查点 是的 我知道创建第二个核心数据堆栈 这也将完
  • NSFetchedResultsController 在 VIPER 架构中的位置是什么?

    In VIPER https www objc io issues 13 architecture viper 与MVC不同的是 NSFetchedResultsController的角色和地点没有那么明确的定义 把它放在交互器上合适吗 根
  • SwiftUI:为什么 ForEach($strings) (文本:Binding)无法构建?

    我有一个ForEach它需要一个 Binding 并使用 Xcode11 beta5 编译 但使用 beta6 则显示Type of expression is ambiguous without more context on the T
  • php/mysql 搜索多个值

    我有一个带有 国家 城市 地区 已发布 字段的表格 我有一个搜索表单 人们可以在其中输入国家 城市或地区 我想要获取所有已发布的房屋 1 并且任何搜索词都与其任何字段相匹配 这是我到目前为止所拥有的 SELECT FROM homes WH
  • 为什么使用 Dijkstra 算法而不是最佳(最便宜)优先搜索?

    从我到目前为止所读到的来看 这最佳优先搜索 https en wikipedia org wiki Best first search在找到到达目标的最短路径方面似乎更快 因为 Dijkstra 算法在遍历图时必须放松所有节点 是什么让 D
  • 为什么我需要在核心数据项目中使用原始访问器方法?

    为什么我需要在核心数据项目中使用原始访问器方法 我正在阅读有关核心数据的内容并注意以下内容 默认情况下 Core Data 动态地 创建高效的公共和原始的 获取和设置访问器方法 建模属性 属性和 管理对象的关系 课程 例如 给定一个实体 属
  • SwiftUI 预览的 Xcode Canvas 不显示

    我正在尝试从 Xcode 11 运行新的 Canvas 功能 但 Canvas 不会显示 我究竟做错了什么 这个新的 Xcode 功能应该在不运行应用程序的情况下显示我的 SwiftUI 视图的实时预览 当您使用 SwiftUI 创建自定义
  • 如何搜索包含表情符号的文本?

    我们有一个 MySQL InnoDB 表 带有一个文本字段COLLATE utf8mb4 unicode ci 我需要搜索包含任何表情符号字符的行 我搜索了相当多的问题 但人们似乎有一个他们正在搜索的表情符号列表 我实际上正在寻找一种可以找
  • Swift NSSet 和 CoreData

    我正在尝试将目标 C 和 CoreData 应用程序移动到 Swift 和 iOS 但在迭代 NSSet 对象时遇到了困难 Xcode 已生成这些类 class Response NSManagedObject NSManaged var
  • SwiftUI 按钮在出现时更改文本大小

    从 GIF 中可以看出 一旦工作表完全打开 完成 按钮文本就会变大 这不仅发生在这个视图中 而且也发生在使用系统图像而不是文本的其他视图中 有谁知道问题的解决方案还是我做错了什么 我仍然对 Swift 记忆犹新 NavigationView

随机推荐