UITableView / UISearchBar返回不正确的结果

时间:2011-03-08 11:55:54

标签: iphone ipod-touch ios-4.2

我正在尝试在UITableView中实现搜索。在搜索时,似乎返回了正确的结果数,但我在结果中收到原始故事数组中的条目,而不是searchResults。我可以看到searchResults数组应该是数据源,但是在经过大量的搜索之后还无法弄清楚如何使用NSDictionaries数组来完成它。任何帮助表示赞赏。

- (void)handleSearchForTerm:(NSString *)searchTerm {
[self setSavedSearchTerm:searchTerm];

if ([self searchResults] == nil)
{
    NSMutableArray *array = [[NSMutableArray alloc] init];
    [self setSearchResults:array];
    [array release], array = nil;
}

[[self searchResults] removeAllObjects];    

if ([[self savedSearchTerm] length] != 0)
{

    for (NSDictionary *currentItem in [self stories])
    {
        if ([[currentItem objectForKey:@"title"] rangeOfString:searchTerm options:NSCaseInsensitiveSearch].location != NSNotFound)
        {
            [[self searchResults] addObject:currentItem];
        }
    }
}

}

2 个答案:

答案 0 :(得分:1)

[tableView isEqual:self.searchDisplayController.searchResultsTableView]也是制作和管理自己的BOOL isFiltering;变量

的另一种选择

答案 1 :(得分:0)

使用NSPredicate进行过滤

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"self.title MATCHES %@",searchTerm];

假设您的原始数组是“originalArray”,那么为了得到过滤后的数组,请使用另外两个全局变量

 NSArray* filteredArray;
 BOOL isFiltering;

现在在搜索栏委托方法中执行以下操作

-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
      NSPredicate* predicate = [NSPredicate predicateWithFormat:@"self.title MATCHES %@",searchTerm];
      filteredArray = [[originalArray filteredArrayUsingPredicate:predicate] retain];
}

现在你需要更改你的表视图委托和数据源,....对于你正在使用的所有地方

NSDictionary *currentString = [originalArray objectAtIndex:indexPath.row];

使用以下

NSDictionary *currentString;
if(isFiltering)
      currentString = [originalArray objectAtIndex:indexPath.row];
else
      currentString = [filteredArray objectAtIndex:indexPath.row];