2011-09-28 45 views
1

我在iOS應用程序的表視圖組件中添加了一個搜索欄,允許通過由詞典組成的NSArray進行搜索。但是,搜索欄並不是一直運行 - 如果數據完全匹配,但不是部分匹配,則會成功打印出結果。例如,如果輸入完整的短語,則會打印出「關閉燈光」,但如果僅輸入「轉動」,則不會打印。但是,在僅由字符串組成的調試數組中,搜索功能完全按照預期工作。iOS Cotains-based Predicate search only only when found match found found

我斷言代碼是在這裏:

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope 
{ 

NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"SELF CONTAINS[cd] %@", searchText]; 

self.searchResults = [allSearchableItems filteredArrayUsingPredicate:resultPredicate]; 

} 

實際工作的試塊是這樣寫的:

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope 
{ 

NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"SELF CONTAINS[cd] %@", searchText]; 

NSArray *array = [NSArray arrayWithObjects:@"Miguel", @"Ben", @"Adam", @"Melissa", nil]; 

NSArray *moreStuff = [array filteredArrayUsingPredicate:resultPredicate]; 

NSLog(@"%@", moreStuff); 

self.searchResults = [allSearchableItems filteredArrayUsingPredicate:resultPredicate]; 

} 

在上面的代碼塊中,NSArray的「moreStuff」打印出來,正確更新,但是在第一個塊中,NSArray「searchResults」僅在輸入完全匹配時才返回結果。我在這裏完全損失,所以任何幫助/建議都將超級讚賞。

回答

5

因爲你在一個對象中尋找一個字符串,所以我認爲你只需要在你的謂詞中深入一點。對象內的字符串只是該對象的部分匹配。當你在謂詞中使用SELF時,你指定在對象本身內進行搜索,在你的情況下它是一個NSDictionary。 NSDictionary中的字符串字段實際上是對象內的對象。因此,如果您正在查找字典中名爲「名稱」的字段,而不是在SELF中查找謂詞,它應該查看SELF.Name。你可以嘗試下面的代碼來搜索你的NSDictionary的Name字段。

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope 
{ 

NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"SELF.Name CONTAINS[cd] %@", searchText]; 

self.searchResults = [allSearchableItems filteredArrayUsingPredicate:resultPredicate]; 

} 

如果仍然需要檢查對象中包含的其他字段,可以創建複合謂詞。有關謂詞的詳細信息可以在Apple's Predicate Programming Guide.

我希望這有助於!

+0

謝謝,這完全解決了我的問題! – KatelynLiz