当我在 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 文件中的函数,它返回一个包含 NSManagedObject
和 NSFetchedResultsController
的数组:
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/