在UITableView中超出边界错误的奇怪objectAtIndex

时间:2013-07-07 20:07:40

标签: ios uitableview nsmutablearray

我正在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];
        }
    }
}

然后重新加载UITableView中的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]'

我检查过过去的历史,计数是10.奇怪的是,在我在搜索栏中输入相同文本的前几次尝试中没有问题。在我的调试代码中,我可以看到计数为10,表视图显示从索引0到9的筛选搜索结果。我无法理解为什么突然filterHistory的索引超出了界限[0..9]?当代码顺利进行时,LogDebug方法会将MyObject从索引0打印到9.但是当它崩溃时,它只打印出“当前行= 10”。

1 个答案:

答案 0 :(得分:2)

performSelectorOnMainThread此处waitUntilDone:NO

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

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

您应该立即使用

替换该行
[self.searchKeywordTableView reloadData];