2012-10-13 78 views
3

這是一個非常基本的問題,儘管我想了解NSPredicate的基礎知識,但我仍然有點難以理解爲什麼我在這裏遇到錯誤(searchText是一個指向傳入方法的NSString對象的指針)。NSPredicate 101:使用NSPredicate和自定義對象的NSMutableArray

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.name contains[cd] %@", searchText]; 
_searchResults = [_personArray filteredArrayUsingPredicate:predicate]; 

我有一個NSMutableArray的自定義對象(例如,Person對象),它有一個名稱屬性。我想要做的就是使用NSPredicate在用戶開始在UISearchBar中輸入時過濾潛在的匹配項。 IB組件非常簡單,看起來運行良好。當我嘗試搜索和但是開始過濾,基本的應用程序崩潰,出現以下錯誤:

'NSInvalidArgumentException', reason: '-[xPerson isEqualToString:]: unrecognized selector sent to instance 0x8043340'

我的理解是謂語將被傳遞到在NSMutableArray中的每個對象,在謂語self關鍵字指的是相應的對象(我相信在這種情況下甚至沒有必要),而.name可以使用自定義對象上的合成屬性。該錯誤似乎表明-isEqualToString:調用正在自定義對象上調用,而不是對象的屬性。

任何有關我在做什麼錯誤的建議將非常感激。

回答

5

嘗試像這樣,

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains[cd] %@", searchText]; 
_searchResults = [_personArray filteredArrayUsingPredicate:predicate]; 
+0

這實際上是我在翻譯關於該主題的一些其他相關主題後嘗試過的,但我仍然一直得到相同的錯誤。 鑑於自定義類是純粹的骨骼,典型的類使用默認的自動合成屬性(實際上是'name'),所以NSPredicate的語法在任何一種情況下都應該是正確的。 我注意到,如果我在謂詞中將'contains'更改爲'like',它會正常工作(雖然我沒有得到任何結果,但至少不會拋出異常)。爲什麼呢,我不知道。 任何人有任何見解? – amerino

+0

我在我的應用程序中有幾乎相同的東西,它完全適用於我的上述代碼。所以我不確定這個問題是否與Predicate有關。 – iDev

0

我有同樣的問題。該錯誤不在精密級別中,而是在表格視圖的單元格中。 我設置的電池是這樣的:

cell.textLabel.text = [self.searchResults objectAtIndex:indexPath.row]; 

我忘了使物體parse.Then我改變了代碼,以這樣的:

cell.textLabel.text = ((Product*)[self.searchResults objectAtIndex:indexPath.row]).name; 

所以,也許你的錯誤回報是不是在NSPredicate太。