您好我正在尝试使用核心数据和NSFetchedResults控制器为表视图实现搜索栏功能。
有很多关于SO的答案建议使用谓词进行搜索,使用类似下面的代码:
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
if ([searchText length] == 0) {
_fetchedResultsController = nil;
}
else {
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains[cd] %@", searchText];
[[_fetchedResultsController fetchRequest] setPredicate:predicate];
[[_fetchedResultsController fetchRequest] setFetchLimit:50];
}
NSError *error;
if (![[self fetchedResultsController] performFetch:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
}
[[self tableView] reloadData];
}
我也试过这种变化。但是,在每种情况下,我都有同样的问题。
首先,当你搜索时,它说没有结果。此外,如果您输入几个字母并点击x,则会出现灰色屏幕,如果再次单击,则会获得正常的表格视图。
然而,在输入一封信并看到"没有结果"如果你点击取消,你会得到你应该得到的结果。一旦发生这种情况,您无法在不重建项目的情况下返回完整的tableview。
我到目前为止唯一的想法是它可能与_fetchedResultsController和fetchedResultsController有关(此源文件中的属性是没有下划线的ftchedResultsController)但是只更改那些抛出错误消息。
感谢您就可能导致此问题的任何建议。
答案 0 :(得分:1)
您有两个表视图,一个来自搜索,另一个来自主表。如果要使用搜索隐含的过滤器继续显示主表视图,则应禁用搜索控制器的表视图。
self.searchResultsController.active = NO;
您可以在每次搜索栏将此设置为YES时设置此项,例如在textDidChange
中。在FRC getter中,检查搜索栏中的任何字符串,并在必要时添加谓词。在textDidChange
{FR} nil
reloadData
{{1}}。就是这样。