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的主要内容,如果未能解决你的问题,请参考以下文章

Cocoa/Objective C:方法和线程安全

WKWebView 的自定义剪切、复制和粘贴操作

Cocoa PDFView 不调整大小

Cocoa osx NSTableview 改变行高亮颜色

Cocoa-touch - 用核心图形绘制到一个接触点

保护文档架构中的模型(Cocoa/Swift)