2011-03-11 33 views
1

我有一個NSTableView,其列被綁定到NSArrayController的子類。 「值」列的每個條目都是文件路徑列表(在模型中),特別是應用程序的PATH和PYTHONPATH。Cocoa中的自定義NSPredicate

我想要的是控制對這些值的編輯,以確保列表中的每個路徑都是有效的。由於我使用的是綁定,因此我認爲我應該編寫某種NSPredicate,但我希望使用我定義的函數來執行過濾器,因爲測試有點複雜。你如何使用NSPredicate的自定義函數?

或者我應該考慮另一種方法?

謝謝。

UPDATE:

我已想出如何使含有文件路徑爲計算結果爲我想要的,使用上的NSString類別,增加了該方法validate表達式中的字符串。但是我仍然不知道如何將它變成過濾器謂詞。

NSString *s = @"~:~/Desktop"; 
NSExpression *f = [NSExpression expressionForConstantValue:s]; 
NSExpression *e = [NSExpression expressionForFunction:f 
             selectorName:@"validate" 
              arguments:nil]; 

我想這將主要是一個過濾謂詞總是吐出什麼表達式的值爲..

回答

1

很簡單:

NSString *s = @"~:~/Desktop"; 
NSPredicate *p = [NSPredicate predicateWithFormat:@"FUNCTION(%@, 'validate') == YES", s]; 

或者,如果你有一個字符串數組你想過濾找到所有通過驗證的:

NSArray *array = ...; //your array of strings needing validation 
NSPredicate *p = [NSPredicate predicateWithFormat:@"FUNCTION(SELF, 'validate') == YES"]; 
NSArray *filtered = [array filteredArrayUsingPredicate:p]; 

有一件事這裏要注意的是-validate方法的結果必須id。所以如果它返回一個真/假的值,它應該返回NSNumber中裝箱的BOOL。 (謂詞格式字符串中的YES會自動轉換爲您的NSNumber

一旦獲得了謂詞,就可以將它設置到數組控制器中或其他類型中。

相關問題