我正在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”。
答案 0 :(得分:2)
performSelectorOnMainThread
此处waitUntilDone:NO
:
[self.searchKeywordTableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
不会立即调用该方法,但稍后会将其作为正常运行循环处理的一部分。
因此,在过滤后,cellForRowAtIndexPath
可能会被称为
数组,但 reloadData
之前的被调用。
您应该立即使用
替换该行[self.searchKeywordTableView reloadData];