我正在实现一个带有谓词的搜索关键字历史记录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
in 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”。