2012-12-16 66 views
1

我無法理解如何使用謂詞,我有一個非常長的代碼來過濾屬性「type」中的對象,並突然看到方法「filteredArrayUsingPredicate」可以讓我的生活更美好。我嘗試寫謂詞,但我總是得到錯誤;有人可以告訴我如何寫它的權利?使用方法filteredArrayUsingPredicate過濾數組中的對象

我有方法- (void) filterData: (NSString *)filteredWord

我也有對象(事件)陣列:的NSArray * eventsArray。 我想使用filteredArrayUsingPredicate獲取新的數組與對象(事件)其屬性(類型)是相等的filterWord。請注意,事件是Core Data Managed子類。

是否有可能通過謂詞做到這一點?

我的一個嘗試:

NSString *propertyName = @"type"; 
NSArray *eventsArray = [[[[self currentPerson] events] objectEnumerator]allObjects]; 
NSPredicate *predicte = [NSPredicate predicateWithFormat:@"%k like '%@'",propertyName,filteredWord]; 
[eventsArray filteredArrayUsingPredicate:predicte]; 

回答

2

試試這個:

NSString *propertyName = @"type"; 
NSArray *eventsArray = [[[self currentPerson] events] allObjects]; 
NSPredicate *predicte = [NSPredicate predicateWithFormat: 
         @"%k like %@",propertyName, filteredWord]; 
NSArray *filteredArray = [eventsArray filteredArrayUsingPredicate:predicte]; 

你忽略的過濾結果。 filteredArrayUsingPredicate: 返回新的NSArray的實例。它不會過濾原始的 數組,因爲NSArray對象是不可變的。你要麼 必須做的一個 NSMutableArray 然後用filterUsingPredicate:到位的濾鏡陣列,或 你必須做一些事情的 filteredArrayUsingPredicate:返回數組(記錄它,將它保存等)

不要在屬性周圍使用單引號。 (感謝@MartinR的線索)

+0

感謝您的評論我認爲我對預測有一點理解..但是由於某種原因,如果我確定有多個對象具有已篩選類型,filteredArray有0個對象。 順便我用'[[array objectEnumerator] allObjects]'因爲事件是NSSET。 – Dennis

+0

在這種情況下,您可以使用'[set allObjects]'。不需要統計員。而且,UIEvent的type屬性不是一個字符串。這是一個枚舉(整數)。看到我更新的答案。 – DrummerB

+0

實際上,「%K」也可以用來代替「SELF。%@」。 「%K」是謂詞中的關鍵路徑的var arg替換。 - 我碰巧知道(來自Dennis之前的問題),「Event」是一個核心數據管理對象的子類,與「UIEvent」無關。所以「%K LIKE%@」應該可以工作。 –

相關問題