2014-01-09 20 views
0

我有一個名爲SCPFLocation的自定義對象的NSSet,我想用每個位置的可讀格式(名爲interpretedForm的屬性)對其進行過濾。以下是我如何做到這一點:無法使NSPredicate在自定義NSObject上工作

NSMutableSet *set = [[SCPFLocation allLocations] mutableCopy]; 
[set filterUsingPredicate:[NSPredicate predicateWithFormat:@"interpretedForm contains[c] '%@'", searchString]]; 
self.matches = [set.allObjects sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
    return [((SCPFLocation *)obj1).interpretedForm compare:((SCPFLocation *)obj2).interpretedForm]; 
}]; 

但我不明白爲什麼這不起作用。在應用謂詞過濾器時,set包含零個對象。我可能做錯了什麼?

SCPFLocationSCPFValue的一個子類,其中SCPFLocation繼承並覆蓋了interpretedForm屬性。以下是SCPFLocation@interface@implementation

@interface SCPFLocation : SCPFValue 

@property (strong, nonatomic) NSString *province; 
@property (strong, nonatomic) NSString *city; 

@end 

@implementation SCPFLocation 

- (NSString *)interpretedForm 
{ 
    if (self.city) { 
     return [NSString stringWithFormat:@"%@, %@", self.city, self.province]; 
    } else { 
     return self.province; 
    } 
} 

@end 

而且SCPFValue.h

@interface SCPFValue : NSObject 

/*! The human-readable representation of this @c SCPFValue. 
*/ 
@property (strong, nonatomic) NSString *interpretedForm; 

/*! A representation of this @c SCPFValue when it is being passed from and to the API. 
*/ 
@property (strong, nonatomic) NSString *originalForm; 

- (id)initWithInterpretedForm:(NSString *)interpretedForm originalForm:(NSString *)originalForm; 

@end 

回答

0

自己弄明白了,答案相當令人沮喪。而不是定義謂詞這樣的:

[NSPredicate predicateWithFormat:@"interpretedForm contains[c] '%@'", searchString] 

我就是這麼做的:

[NSPredicate predicateWithFormat:[NSString stringWithFormat:@"interpretedForm contains[c] '%@'", searchString]] 

和它的工作。我不知道爲什麼第一種形式在Apple的Predicate Format String Syntax之後非常有問題。

+1

嗯......這本質上是一樣的東西格式/字符串的東西只是創建一個字符串,你剛剛推了一步你可以把predicateWithFormat放回三重檢查它的文本嗎? – Fogmeister

+0

是的,我把它放回到沒有'NSString'的第一個表單,它停止工作。必須是某種iOS錯誤?我正在構建對於iOS 7. –

+2

剛剛做的如何 - [NSPredicate predicateWithFormat:@「decodedForm contains [c]%@」,searchString] - 我不認爲你需要單引號%@ –

0

你沒有投中這樣的塊對象。我覺得這個表格更易於閱讀。

NSMutableSet *set = [[SCPFLocation allLocations] mutableCopy]; 

[set filterUsingPredicate:[NSPredicate predicateWithFormat:@"interpretedForm contains[c] '%@'", searchString]]; 

self.matches = [set.allObjects sortedArrayUsingComparator:^NSComparisonResult(SCPFLocation *obj1, SCPFLocation *obj2) { 
    return [obj1.interpretedForm compare:obj2.interpretedForm]; 
}]; 

說了這麼多。那裏沒有任何東西不會奏效。它怎麼不起作用?

你可以顯示一個對象和搜索字符串不工作的例子。

+0

感謝您的鑄造技巧。我很確定謂詞是問題。 'set'被所有的位置對象正確初始化。我也嘗試過濾一個'NSSet'作爲''interpretationForm''的'NSString',然後我做了謂詞'@「SELF包含[c]'%@'」'並且它工作正常。儘管如此,我仍然非常想保留一組'SCPFLocation'對象。考慮到子類化和從SCPFLocation中重寫的'interpretationForm' getter,格式可能是錯誤的嗎? –

+0

您能否在interpreterForm方法中設置斷點來檢查過濾期間是否調用該方法? – CarlJ

+0

對不起。我先寫了答案,但後來才意識到我看錯了一點,但答案寫得如此以爲我會離開它:D – Fogmeister

相關問題