2011-03-11 26 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

一旦获得了谓词,就可以将它设置到数组控制器中或其他类型中。

相关问题