- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {
[displayItems removeAllObjects]; //clear array to ensure no repeat info
if ([searchText length] == 0) {
displayItems = (NSMutableArray *)allItems;
}
else {
//search by item category
NSPredicate *catPredicate = [NSPredicate predicateWithFormat:@"category
CONTAINS[cd] %@",searchText];
[searchable filterUsingPredicate:catPredicate];
//further search by item name
NSPredicate *namePredicate = [NSPredicate predicateWithFormat:@"name CONTAINS[cd]
%@",searchText];
[searchable filterUsingPredicate:namePredicate];
displayItems = searchable;
searchable = (NSMutableArray *)allItems;
}
[self.searchResults reloadData];
}
此方法是我试图为较大项目创建的简单可搜索表视图的一部分。我的代码编译并运行,当我在搜索栏中键入内容时,搜索功能似乎可以正常工作,但是一旦输入第二个字母,程序就会崩溃。如果我连续输入两个字母,则会抛出'NSInvalidArgumentException',原因:' - [_ NSArrayI filterUsingPredicate:]:无法识别的选择器发送到实例0x6d6c040',但如果我键入一个字母然后按Enter或Backspace,它抛出这个人'NSInvalidArgumentException',原因:' - [ _NSArrayI removeAllObjects]:无法识别的选择器发送到实例0x6a7f300'当我键入第二个字母。使用NSPredicate搜索对象阵列
我对objective-c很新颖,这让我感到困惑。我可以得到任何帮助将不胜感激....: - /更新后仍然有问题。
searchable =(NSMutableArray *)allItems; 你不能通过铸造一个NSArray到一个NSMutableArray – 2012-02-23 08:14:35
searchable被声明为一个NSMutableArray,allItems是一个NSArray。我铸造它,以便我可以将allItems的所有项目放回到可搜索的数组中。我不知道这是否合法,或者如果这是你的意思。对不起,似乎无助和困惑,但Objective-C是我的新领域。作为一个方面说明,我只是尝试了一种完全不同的搜索算法,其中有问题的行和NSPredicate语句被删除,并且我遇到了同样的问题,除了函数甚至没有假装工作。 – 2012-02-23 17:16:22
非常感谢!我回到了NSPredicate解决方案,并用addObjectsFromArray替换了铸造语句,它的工作就像一个魅力。我不明白为什么,但它工作。谢谢您的帮助。 – 2012-02-23 17:28:11