来自 searchDisplayController 的 tableView (searchDisplayController?.searchResultsTableView)
您还为fetchedResultsController、searchResultsController、appDelegate 和managedObjectContext 创建类变量:
let appDelegate = UIApplication.sharedApplication().delegate as? AppDelegate
var managedObjectContext: NSManagedObjectContext? {
get {
if let delegate = appDelegate {
return delegate.managedObjectContext
}
return nil
}
}
var fetchedResultsController: NSFetchedResultsController?
var searchResultsController: NSFetchedResultsController?
在viewDidLoad() 中,您必须为searchResultsTableView 注册您的单元格,因为它在界面中不存在:
searchDisplayController?.searchResultsTableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "CellID")
你也在这里设置你的 fetchRequest:
fetchedResultsController = NSFetchedResultsController(fetchRequest: someFetchRequest, managedObjectContext: managedObjectContext!, sectionNameKeyPath: nil, cacheName: nil)
fetchedResultsController?.delegate = self
fetchedResultsController?.performFetch(nil)
您将需要一个函数来根据 tableView 返回您需要的 FRC。你让这个函数返回一个NSFetchedResultsController,你将在所有从FRC中提取数据的表视图函数中使用它,比如cellForRowAtIndexPath:,因为它会给你正确的数据集
func fetchedResultsControllerForTableView(tableView: UITableView) -> NSFetchedResultsController? {
return tableView == searchDisplayController?.searchResultsTableView ? searchResultsController? : fetchedResultsController?
}
最后,你需要实现searchDisplayControllerWillUnloadSearchResults和searchDisplayControllerShouldReloadTableForSearchString:
func searchDisplayController(controller: UISearchDisplayController, willUnloadSearchResultsTableView tableView: UITableView) {
searchResultsController?.delegate = nil
searchResultsController = nil
}
func searchDisplayController(controller: UISearchDisplayController!, shouldReloadTableForSearchString searchString: String!) -> Bool {
let firstNamePredicate = NSPredicate(format: "nameFirst CONTAINS[cd] %@", searchString.lowercaseString)
let lastNamePredicate = NSPredicate(format: "nameLast CONTAINS[cd] %@", searchString.lowercaseString)
let predicate = NSCompoundPredicate.orPredicateWithSubpredicates([firstNamePredicate!, lastNamePredicate!])
searchResultsController = NSFetchedResultsController(fetchRequest: someOtherFetchRequestWithPredicate(predicate), managedObjectContext: managedObjectContext!, sectionNameKeyPath: nil, cacheName: nil)
searchResultsController?.performFetch(nil)
return true
}
如果您在填写其他内容时遇到任何问题,例如数据模型或 NSFetchedResultsControllerDelegate 方法,请查看demo!