2

我的表格视图有一个搜索栏,但我没有使用 aUISearchDisplayController来显示结果,而是使用我的表格视图。

我的代码似乎可以工作,但我想知道这是否可以接受。当用户开始输入时,我添加一个谓词来执行搜索,当用户删除搜索栏中的文本时,我将 nil 取出来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];
}
4

2 回答 2

6

唯一不同的是,如果您有很多记录,我会在结果中添加一个获取限制,但是是的,这种方法没有任何问题。

也许像

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains[cd] %@", searchText];
[[_fetchedResultsController fetchRequest] setPredicate:predicate];
[[_fetchedResultsController fetchRequest] setFetchLimit:50];
于 2013-05-17T20:20:43.913 回答
0

一种干净的方法是创建一个可变数组,该数组将仅包含与您的搜索匹配的对象。

self.searchResults = [NSMutableArray array];

由于您不使用 aUISearchDisplayController您需要一个布尔标志来指示您是否正在执行搜索。

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.

这个想法来自@BenSheirmanSearching inUITableView。然后我根据您的要求对其进行了修改。

希望能帮助到你。

于 2013-05-18T15:20:01.927 回答