0

我正在实现一个带有谓词的搜索关键字历史记录UITableView

我在 viewDidLoad 中分配并初始化一个NSMutableArray对象。filteredHistory当我在搜索栏上键入内容时(使用 中的TextDidChange方法UISearchBar),该数组将被填充。

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
    [self filterContentForSearchText:searchText];
    [self.searchKeywordTableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
    LogDebug(@"Filtered history count: %d", self.filteredHistory.count);
}

我使用这样的方法来过滤:

- (void)filterContentForSearchText:(NSString*)searchText
{
    [self.filteredHistory removeAllObjects]; // First clear the filtered array.
    for (MyObject *searchKeyword in self.searchHistory)
    {
        NSPredicate *predicate = [NSPredicate predicateWithFormat:
                                  @"(SELF contains[cd] %@)", searchText];
        [searchKeyword.name compare:searchText options:NSCaseInsensitiveSearch];
        BOOL resultName = [predicate evaluateWithObject:searchKeyword.name];
        if(resultName)
        {
            [self.filteredHistory addObject:searchKeyword];
        }
    }
}

然后重新加载UITableViewin TextDidChange

tableView numberOfRowsInSection:方法

return self.filteredHistory.count;

在我的 cellForRowAtIndexPath 方法中,我有:

LogDebug(@"Current row = %d", indexPath.row);
MyObject search = [self.filteredHistory objectAtIndex:indexPath.row];

然后在我测试了几次后,应用程序崩溃并显示错误消息:

[__NSArrayM objectAtIndex:]: index 10 beyond bounds [0 .. 9]'

我检查了filteredHistory,计数是10。奇怪的是,在最初的几次尝试中,当我在搜索栏中输入相同的文本时没有问题。在我的调试代码中,我可以看到计数为 10,并且表格视图显示了从索引 0 到 9 的过滤搜索结果。我不明白为什么过滤历史的索引突然超出范围 [0..9]?当代码运行顺利时,LogDebug 方法打印出 MyObject 从索引 0 到 9。但是当它崩溃时,它只打印出“当前行 = 10”。

4

1 回答 1

2

performSelectorOnMainThreadwaitUntilDone:NO这里:

[self.searchKeywordTableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];

不会立即调用该方法,而是稍后作为正常运行循环处理的一部分。因此,可能会您过滤数组之后调用,但cellForRowAtIndexPath在调用之前调用。 reloadData

您应该立即致电替换该行

[self.searchKeywordTableView reloadData];
于 2013-07-07T20:21:34.367 回答