2012-02-23 68 views
0
- (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很新颖,这让我感到困惑。我可以得到任何帮助将不胜感激....: - /更新后仍然有问题。

+0

searchable =(NSMutableArray *)allItems; 你不能通过铸造一个NSArray到一个NSMutableArray – 2012-02-23 08:14:35

+0

searchable被声明为一个NSMutableArray,allItems是一个NSArray。我铸造它,以便我可以将allItems的所有项目放回到可搜索的数组中。我不知道这是否合法,或者如果这是你的意思。对不起,似乎无助和困惑,但Objective-C是我的新领域。作为一个方面说明,我只是尝试了一种完全不同的搜索算法,其中有问题的行和NSPredicate语句被删除,并且我遇到了同样的问题,除了函数甚至没有假装工作。 – 2012-02-23 17:16:22

+0

非常感谢!我回到了NSPredicate解决方案,并用addObjectsFromArray替换了铸造语句,它的工作就像一个魅力。我不明白为什么,但它工作。谢谢您的帮助。 – 2012-02-23 17:28:11

回答

1

“一个不只是的NSArray到NSMutableArray里,然后调用它的NSMutableArray方法” - 博罗米尔

创建一个可变的副本,而不是像这样:

searchable = [allItems mutableCopy]; 

注意:请务必当你完成它时释放可搜索的内容。

+0

有趣。我不知道mutableCopy。我现在做,谢谢。 – 2012-02-23 20:45:40

+0

为Boromir报价:) – mokagio 2013-10-18 10:41:07

0

你必须使用NSMutableArray来调用方法。

NSArray有一个方法“filteredArrayusingPredicate”。

简单的解决方案是使用NSMutableArray。

+0

不幸的是,**可搜索**和** displayItems **都是NSMutableArrays。尽管我认为可搜索是唯一一个触及谓词的人。 – 2012-02-23 02:15:07