我总是在代码中创建我的NSFetchRequests.现在我正在寻找Xcode GUI来构建一个获取请求并将其存储在模型中.
我正在关注Xcode文档中的一个示例.我向模型添加了一个获取请求,并且通过Modeling GUI创建的谓词是:
firstName LIKE[c] "*SUBSTRING*"
Run Code Online (Sandbox Code Playgroud)
然后我用这两行检索该请求:
NSDictionary *substituionDictionary = [NSDictionary dictionaryWithObject:@"woody" forKey:@"SUBSTRING"];
NSFetchRequest *fetchRequest = [mom fetchRequestFromTemplateWithName:@"firstNameContains" substitutionVariables:substituionDictionary];
Run Code Online (Sandbox Code Playgroud)
生成的NSFetchRequest的NSLog输出:
(entity: Customer; predicate: (firstName LIKE[c] "*SUBSTRING*"); sortDescriptors: (null); limit: 0)
Run Code Online (Sandbox Code Playgroud)
..表示在返回存储的FetchRequest之前未替换变量.
那么,如何指定在Xcode数据建模获取请求谓词生成器GUI中输入的文本将在运行时由NSFetchRequest替换:fetchRequestFromTemplateWithName:substitutionVariables:?
谢谢!
伍迪
cocoa core-data data-modeling nspredicateeditor nsfetchrequest
Xcode 4的谓词编辑器控件存在一些问题 - 我认为我做的一切都是正确的,而且看起来IDE本身就被破坏了.
我在我正在编写的应用程序中遇到此问题,但为了隔离它,我执行了以下操作:
使用窗口创建新项目.在XIB编辑器中,向其添加NSPredicateEditor,并添加一行.将其保留为关键路径/字符串,并添加两个关键路径 - "标题"和"编写者".使它成为案例和变音不敏感.
创建NSWindowController的子类并为谓词编辑器添加IBOutlet.
在awakeFromNib中,输入以下代码:
NSPredicate*myPredicate = [NSPredicate predicateWithFormat:@"(标题CONTAINS [CD]%@)AND(作者CONTAINS [CD]%@)",@"",@""];
[_predicateEditor setObjectValue:myPredicate];
这会在控制台中产生以下内容:
2011-04-12 15:59:37.709 PredicateTest [38419:903]警告 - 无法找到模板匹配谓词标题CONTAINS [cd]""
2011-04-12 15:59:37.710 PredicateTest [38419:903]警告 - 无法找到模板匹配谓词作者CONTAINS [cd]""
当我单击(+)按钮添加新行时,我得到以下内容:
2011-04-12 15:59:40.044 PredicateTest [38419:903]无法使用nil运算符或表达式创建比较谓词.
我是否正确地认为我在这里做错了什么,这应该有用吗?如果我更改谓词编辑器行模板远离键路径,然后将其切换回键路径,并编辑键路径列表,Xcode崩溃与内部一致性异常,这让我觉得Xcode 4可能不符合要求它涉及到谓词编辑.
有人有任何想法吗?我已经尝试在代码而不是XIB编辑器中创建NSPredicateEditor,并且无休止地搞乱无济于事.谓词编辑功能正在阻止我向商店发布应用程序,所以这有点令人烦恼.
我有一个谓词编辑器,模板是通过以下方式生成的:
NSArray * test = [NSArray arrayWithObjects:
[NSExpression expressionForKeyPath: @"Abc"],
[NSExpression expressionForKeyPath: @"Def"],
nil];
NSPredicateEditorRowTemplate * template = [[NSPredicateEditorRowTemplate alloc] initWithLeftExpressions: test
rightExpressionAttributeType: NSStringAttributeType
modifier: NSDirectPredicateModifier
operators: [NSArray arrayWithObject:
[NSNumber numberWithUnsignedInteger:NSContainsPredicateOperatorType]]
options:(NSCaseInsensitivePredicateOption|NSDiacriticInsensitivePredicateOption)];
Run Code Online (Sandbox Code Playgroud)
所以,如果我填写这样的谓词编辑器:

当我注销生成的谓词时,我得到:
Abc CONTAINS[cd] "abc" OR Def CONTAINS[cd] "def"
我想知道的是,如果我能以某种方式让谓词编辑器模板显示与生成的谓词中设置的值不同.
EX:我希望输出谓词具有:
Field1 CONTAINS[cd] "abc" OR Field2 CONTAINS[cd] "def"
即使编辑器仍然显示abc和def作为字段.这可能吗?
cocoa objective-c nspredicateeditor nspredicate nsexpression
我正在构建一个NSPredicateEditor,我希望能够进行高级日期比较.
我知道我可以建立一个NSPredicateEditorRowTemplate带有rightExpressionType的NSDateAttributeType,但我想建立的谓词必须远不止于此先进.
例如,我需要基本的比较,如:
dateKeypath < aDatedateKeypath <= aDatedateKeypath = aDatedateKeypath != aDatedateKeypath > aDatedateKeypath >= aDate这些基本比较很容易实现,我有这些工作.但是,我还需要进行比较,例如:
dateKeypath isInTheLast n days (或数周,数月,年)dateKeypath isNotInTheLast n days (或数周,数月,年)dateKeypath between aDate and anotherDate我怎样才能实现这些比较?我知道我需要创建一个自定义NSPredicateEditorRowTemplate,但我没有找到任何关于如何实现这样的清晰文档.
编辑
奖励积分也可用于知道如何使这些比较成为完整的日期 - 时间(年 - 月 - 日 - 时 - 分 - 秒)比较(因为NSDateAttributeType只有年 - 月 - 日的粒度).
我想模仿Finder的谓词列表.特别是LeftExpressions弹出窗口带有"其他"(德语:"Andere ...")菜单条目,并且喜欢用用户可选择的搜索谓词列表弹出NSSheet.

我的方法是使用名为"other ..."的leftExpression创建一些NSPredicateEditorRowTemplates和一个最后一个自定义rowTemplate.
然后我重写templateViews方法并添加了separatorItem:
-(NSArray *)templateViews{
NSMutableArray * views = [[super templateViews] mutableCopy];
// I tried already to add here my custom menu entry, but if I add more templates my custom entry (and the separator line) is not fixed at the last index.
if (!isCustomMenuItemAdded) {
NSPopUpButton *leftButton = views[0];
// Add a menu separator
[[leftButton menu]insertItem:[NSMenuItem separatorItem] atIndex:[leftButton menu].itemArray.count-1];
}
return views;
}
Run Code Online (Sandbox Code Playgroud)
我的自定义predicateEditor现在显示正确,但是如果我点击最后一个菜单项'Other ..',则显示虚拟NSPredicateRowTemplate.
我试图在我的rowTemplate类中覆盖 - (id)复制方法来抑制新行,但这对我来说很奇怪.
-(id)copy{
return nil; // OK, now there is no …Run Code Online (Sandbox Code Playgroud) 我正在代码中创建一个NSPredicateEditor,并试图实现我希望的相当简单的任务.基本上,我想显示一个复合NSPredicateEditorRowTemplate(给用户提供在"All/Any/None以下都是真"时执行匹配的选项)和它下面的一些相当基本的子行.为此,我构造我的NSPredicateEditor并绑定其值,以便在用户编辑其谓词时保存更改.
我遇到的问题是,无论如何,我都不能将复合NSPredicateEditorRowTemplate默认显示为具有单个子行的父行.当我最初创建谓词时,我传递了一个虚假的空谓词,如下所示:
filename BEGINSWITH[cd] ''
Run Code Online (Sandbox Code Playgroud)
为了强制显示复合行,我必须创建两个子行:
filename BEGINSWITH[cd] '' && path ==[cd] ''
Run Code Online (Sandbox Code Playgroud)
作为参考,这是我如何构建NSPredicateEditor:
NSArray *keyPaths = [NSArray arrayWithObjects:[NSExpression expressionForKeyPath:@"filename"], [NSExpression expressionForKeyPath:@"path"], nil];
NSArray *operators = [NSArray arrayWithObjects:[NSNumber numberWithInteger:NSEqualToPredicateOperatorType],
[NSNumber numberWithInteger:NSNotEqualToPredicateOperatorType],
[NSNumber numberWithInteger:NSBeginsWithPredicateOperatorType],
[NSNumber numberWithInteger:NSEndsWithPredicateOperatorType],
[NSNumber numberWithInteger:NSContainsPredicateOperatorType],
nil];
NSPredicateEditorRowTemplate *template = [[NSPredicateEditorRowTemplate alloc] initWithLeftExpressions:keyPaths
rightExpressionAttributeType:NSStringAttributeType
modifier:NSDirectPredicateModifier
operators:operators
options:(NSCaseInsensitivePredicateOption | NSDiacriticInsensitivePredicateOption)];
NSArray *compoundTypes = [NSArray arrayWithObjects:[NSNumber numberWithInteger:NSNotPredicateType],
[NSNumber numberWithInteger:NSAndPredicateType],
[NSNumber numberWithInteger:NSOrPredicateType],
nil];
NSPredicateEditorRowTemplate *compound = [[NSPredicateEditorRowTemplate alloc] initWithCompoundTypes:compoundTypes];
NSArray *rowTemplates = [NSArray arrayWithObjects:compound, template, nil];
[template release];
[compound release];
predicateEditor = …Run Code Online (Sandbox Code Playgroud) 据我所知,NSPredicateEditor不适用于iOS.但有没有人为iOS创建类似的东西?
我认为由于屏幕要小得多,因此用户界面相当困难,但我不明白为什么理论上这是不可能的.
一个NSPredicateEditor可在复合模式进行设置,使用IB或代码
[predicateEditor setNestingMode:NSRuleEditorNestingModeCompound];
Run Code Online (Sandbox Code Playgroud)
然后,用户可以按住'option'键添加另一条复合线,以生成复杂的过滤器
((A和B)或C)
有些用户可能会在阅读应用文档后大约一分钟内知道如何在搜索网络后的五分钟内完成此操作,或者他们可能永远都不会学习并放弃应用程序.
我想提出一些建议,以建立一个用户友好的方式来使用多个复合线NSPredicateEditor.
我正在尝试在应用程序中复制Finder的基于NSPredicateEditor的元数据搜索.
我更愿意免费获得Finder的确切NSPredicateEditor,但除非有人对这个问题有更好的答案,否则看起来我将不得不尽可能地复制Finder的搜索.
在镜像Kind选项时,我遇到了问题.我开始使用所有可用Kind选项保存Finder Spotlight搜索.
Run Code Online (Sandbox Code Playgroud)
我看到的问题是,单个"Kind"用户显示的文本包含多个键路径,这些路径在结果NSPredicate中使用,基于选择的正确值.
"类"可表示(至少)kMDItemContentTypeTree,_kMDItemGroupId或kMDItemKind.
当我创建一个NSPredicateEditorRowTemplate时,我传递一个左表达式,运算符和右表达式的数组.然后创建包含Left/Operator/Right的所有可能排列的行模板.
(注意:我是以编程方式而不是在Interface Builder中创建所有NSPredicateEditorRowTemplate的).
Finder 没有创建3个左键路径和12个右键值的所有可能排列.它根据右侧拾取的值有选择地分配某个左键路径.
我正在使用NSRuleEditor的 …
cocoa nspredicateeditor appkit nspredicate nspredicateeditorrow
我可以使用NSPredicateEditor(NSRuleEditor的子类)轻松创建NSPredicate.我想知道的是:
如何获取现有的NSPredicate(由编辑器创建)并将其重新加载到编辑器中以便我可以更改它?
编辑:我试过@John关于使用setObjectValue:的建议,但这并不是很有效.让我解释一下我的设置:
我有一个基于文档的可可应用程序,而文档窗口上只有一个NSPredicateEditor.在dataOfType:error:方法中,我有:
NSPredicate * pred = [predicateEditor objectValue];
NSData * predicateData = [NSKeyedArchiver archivedDataWithRootObject:pred];
return predicateData;
Run Code Online (Sandbox Code Playgroud)
在readFromData:ofType:error:方法中,我有:
NSPredicate * pred = [NSKeyedUnarchiver unarchiveObjectWithData:data];
[predicateEditor setObjectValue:pred];
return (pred != nil);
Run Code Online (Sandbox Code Playgroud)
我已经验证谓词正确归档和取消归档,但在打开保存的谓词后,谓词不会加载到predicateEditor中.(是的,谓词编辑器被连接为IBOutlet)
我有一个非常奇怪的问题.我正在尝试使用IB将NSPredicateEditor放入我的界面,当我构建应用程序时,它只显示为一个空的灰色矩形.这是我没有对默认值应用任何更改,包括不修改默认模板.可能会发生什么?
我正在尝试NSPredicateEditorRowTemplate从实体Foo生成一个左侧有许多属性名称的属性,其中包括属性bar。当用户选择“ bar ”时,右侧应成为包含“ bar ”所有值的弹出窗口。
我怎样才能最好地填充右侧弹出窗口?bar 的所有唯一值都存储在一个 中NSMutableArray,因此也许我可以在数组更改时使用 KVO 更改行模板。
有没有办法可以使用代码轻松更改NSPredicateEditor连续右侧弹出窗口中的值?我可以在 IB 中输入一些静态值,但在这种情况下不会这样做。
编辑
阅读了大量相关问答,包括Xcode 4 中的 NSPredicateEditor以及@Dave DeLong 对它的出色回答,我认为很多工作可以这样完成:
NSArray *leftexp = @[[NSExpression expressionForKeyPath:@"name"],[NSExpression expressionForKeyPath:@"married"]];
NSArray *rightexp = @[[NSExpression expressionWithFormat:@"One"],[NSExpression expressionWithFormat:@"Two"]];
NSPredicateEditorRowTemplate *template = [[NSPredicateEditorRowTemplate alloc] initWithLeftExpressions:leftexp rightExpressions:rightexp modifier:NSDirectPredicateModifier operators:@[@(NSEqualToPredicateOperatorType)] options:0];
NSPredicateEditorRowTemplate *compound = [[NSPredicateEditorRowTemplate alloc] initWithCompoundTypes:@[@(NSOrPredicateType)]];
[self.predicateEditor setRowTemplates:@[template,compound]];
NSEntityDescription *description = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:self.managedObjectContext];
self.predicate = [NSPredicate predicateWithFormat:@"name == ''"];
Run Code Online (Sandbox Code Playgroud)
我已经看到了一些办法,使基本NSPredicateEditor出现(至少与复合线),但在我看来,必须有一种优雅的方式来做到这一点,它的方式意味着要做。但是找不到,有人可以帮我解决这个问题吗?
cocoa ×11
nspredicate ×6
objective-c ×5
nsexpression ×2
appkit ×1
core-data ×1
date ×1
ios ×1
iphone ×1
macos ×1
xcode ×1
xcode4 ×1