Cocoa 中的自定义 NSPredicate
Posted
技术标签:
【中文标题】Cocoa 中的自定义 NSPredicate【英文标题】:Custom NSPredicate in Cocoa 【发布时间】:2011-03-11 22:50:07 【问题描述】:我有一个 NSTableView,其列绑定到 NSArrayController 的子类。 “值”列的每个条目都是文件路径列表(在模型中),特别是应用程序的 PATH 和 PYTHONPATH。
我想要的是控制对这些值的编辑,以确保列表中的每个路径都是有效的。由于我正在使用绑定,我想我应该编写某种 NSPredicate 但我想让它使用我定义的函数来执行过滤器,因为测试有点复杂。您如何将自定义函数与 NSPredicate 一起使用?
或者我应该考虑另一种方法吗?
谢谢。
更新:
我已经想出如何使用 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
)
一旦获得谓词,就可以将其设置到数组控制器或其他任何东西中。
【讨论】:
以上是关于Cocoa 中的自定义 NSPredicate的主要内容,如果未能解决你的问题,请参考以下文章