我有一个带有我的表格视图的搜索栏,但我没有使用UISearchDisplayController
来显示结果,而是使用我的表格视图。
我的代码似乎有效,但我想知道这是否可以接受。当用户开始输入时,我添加一个谓词来执行搜索,当用户删除搜索栏内的文本时,我将NSFetchResultsController
取出以获取所有内容。
我在这里做了什么可怕的错误,还是有更好的方法来做到这一点?
- (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];
}
NSError *error;
if (![[self fetchedResultsController] performFetch:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
}
[[self tableView] reloadData];
}
答案 0 :(得分:6)
我唯一不同的是在你有大量记录的情况下为结果添加一个获取限制,但是,这个方法没有任何问题。
也许像
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains[cd] %@", searchText];
[[_fetchedResultsController fetchRequest] setPredicate:predicate];
[[_fetchedResultsController fetchRequest] setFetchLimit:50];
答案 1 :(得分:0)
一种干净的方法是创建一个只包含与搜索匹配的对象的可变数组。
self.searchResults = [NSMutableArray array];
由于您不使用UISearchDisplayController
,因此您需要一个布尔标志,表明您正在执行搜索。
self.performSearch = NO;
执行搜索时,请执行以下操作。
- (void)performSearchForTerm:(NSString *)term {
self.performSearch = YES; // you need to reset after!!!
[self.searchResults removeAllObjects];
NSFetchRequest *fetchRequest = // create your request here...
NSError *error = nil;
NSArray *results = [[self managedObjectContext] executeFetchRequest:fetchRequest error:&error];
if (error) {
// do something here...
}
[self.searchResults addObjectsFromArray:results];
}
现在,您需要根据self.fetchedResultsController
从self.searchResults
切换到self.performSearch
,反之亦然。
这个想法来自Searching in UITableView
@BenSheirman 。然后我根据你的要求修改了它。
希望它有所帮助。