swift - iOS Swift - 使用谓词核心数据来过滤 tableView

标签 swift uitableview core-data filter predicate

当我在 tableView 中搜索时,我试图过滤我的 NSFetchedResultsController 对象。我尝试过使用 NSPredicate 但无法使其工作。
我正在使用 Swift 3。
这是我的代码:

func filtrarContenido(searchText: String) {
    let buscar = searchText.lowercased()

    let nombrePredicate = NSPredicate(format: "nombre_comercial contains[cd] %@", buscar)
    let razSocialPredicate = NSPredicate(format: "razon_social contains[cd] %@", buscar)
    let predicate = NSCompoundPredicate(type: NSCompoundPredicate.LogicalType.or, subpredicates: [nombrePredicate, razSocialPredicate])

    let respuesta = self.funcCoreData.obtenerResultadosFiltrados(entidad: "Clientes", orden: "nombre_comercial", ascendente: true, predicate: predicate)
    self.resultadosFiltrados = respuesta[1] as! NSFetchedResultsController<NSManagedObject>

    do {
        try self.resultadosFiltrados.performFetch()
    } catch {
        print("👋 \(error)")
    }
}

这是 FuncCoreData 文件中的函数,它返回一个包含 NSManagedObjectNSFetchedResultsController 的数组:

func obtenerResultadosFiltrados(entidad: String, orden: String, ascendente: Bool, predicate: NSPredicate) -> [AnyObject] {
    let appDelegate = UIApplication.shared.delegate as? AppDelegate
    let context = appDelegate?.persistentContainer.viewContext

    let objeto = NSFetchRequest<NSManagedObject>(entityName: entidad)
    let ordenacion = NSSortDescriptor(key: orden, ascending: ascendente)
    objeto.sortDescriptors = [ordenacion]
    objeto.predicate = predicate

    print("OBJETO: ", objeto)

    let recorrerResultados = NSFetchedResultsController<NSManagedObject>(fetchRequest: objeto, managedObjectContext: context!, sectionNameKeyPath: "seccionLetra", cacheName: nil)

    var array = [AnyObject]()
    array.append(objeto)
    array.append(recorrerResultados)

    return array
}

嗯,没有出现任何错误,但是搜索总是返回空,我认为我在谓词中的表达式不正确: NSPredicate(格式:“razon_social contains[cd] %@”,buscar)
此外,我想让它不敏感,这是通过ANY razon_social .. 实现的?

最佳答案

你的谓词对我来说看起来是有效的。 “c”代表不区分大小写,“d”代表重音符号之类的东西。

我尝试建立一个与您的项目类似的项目,其中有一个名为 Clientes 的实体,其中包含 3 个名为 nombre_comercial、razon_social 和 secionLetra 的可选字符串,使用了您的函数,并且似乎有效。

我尝试在执行Fetch()之后立即打印结果并得到正确的结果。

do {
    try resultadosFiltrados.performFetch()
    if let results = resultadosFiltrados.fetchedObjects as? [Clientes] {
        print ("results.count \(results.count)")
        for cliente in results {
            print("nombre comercial \(cliente.nombre_comercial! )")
        }
     }            
} catch {
    print("👋 \(error)")
}

您应该尝试检查数据是否正确,例如通过删除谓词来查看完整的结果等。

关于swift - iOS Swift - 使用谓词核心数据来过滤 tableView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41747175/

相关文章:

iphone - 当出现内存不足警告时,核心数据是否会自动采取适当的措施?

ios - 写入 coredata,即使在后台线程上完成,也会大大阻塞 UI

ios - 事件指示器仅在表格单元格原型(prototype)中第一次旋转

ios - 以编程方式添加标签,与 Storyboard 中的标签对齐

ios - Swift 函数指针数组给出编译器段错误 11

ios - 无法使标识符为 "GroupMessageCell"的单元格出队

ios - 静态 TableView - UITextField 被键盘隐藏

ios - CoreDataBooks 问题断言失败。

ios - 无法将类型 'Array<Dictionary<String, String>>' 的值分配给类型 '[MyVC.Objects]'

swift - Kingfisher 是否支持视频缓存?