2012-02-23 78 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