Я использовал немного другое решение: вместо того, чтобы полагаться на другой NSFetchedResultsController, я создал NSMutableArray (FilterListContent) в контроллере табличного представления, который использовался для хранения временных данных, как вдохновлено примером кода Apple и учебник Мугунта Кумара .
В tableView: cellForRowAtIndexPath:, возвращая соответствующий массив источника данных:
if(receivedTableView == self.searchDisplayController.searchResultsTableView){
Objects* object = [self.filteredListContent objectAtIndex:indexPath.row];
cell.textLabel.text = object.name;
} else {
Objects* object = [self.unfilteredListContent objectAtIndex:indexPath.row];
cell.textLabel.text = object.name;
}
Как и в примере кода Apple, добавьте почти такой же метод в другие методы, такие как
- (NSInteger)tableView:(UITableView *)receivedTableView numberOfRowsInSection:(NSInteger)section {
if(receivedTableView == self.searchDisplayController.searchResultsTableView){
return [self.filteredListContent count];
}
return [self.unfilteredListContent count];
}
Как и в tableView: didSelectRowAtIndexPath: ...
Затем соответствовал протоколу UISearchDisplayDelegate и добавил следующие методы:
- (void)filterContentForSearchText:(NSString*)searchText
{
if (!self.filteredListContent) {
self.filteredListContent = self.filteredListContent = [[NSMutableArray alloc] init];
}
[self.filteredListContent removeAllObjects];
for (Objects *object in [self.coreDataStuffVariable.fetchedResultsController fetchedObjects])
{
NSPredicate *predicate = [NSPredicate predicateWithFormat:
@"(SELF contains[cd] %@)", searchText];
NSString * elementTitle = [NSString stringWithFormat:@"%@", object.name];
[elementTitle compare:searchText options:NSCaseInsensitiveSearch];
if([predicate evaluateWithObject:elementTitle])
{
[self.filteredListContent addObject:password];
}
}
}
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller
shouldReloadTableForSearchString:(NSString *)searchString{
[self filterContentForSearchText:searchString];
// Return YES to cause the search result table view to be reloaded.
return YES;
}
Довольно просто. Я думаю, это может плохо закончиться, если основные объекты данных будут перезагружены во время поиска, но хорошо ... если вы можете спать, зная, что тогда это может быть хорошим решением!