Xcode 4的谓词编辑器控件有点问题-我认为我做的一切都是正确的,而且看起来IDE本身确实被破坏了。
我正在编写的应用程序中遇到此问题,但为了隔离它,我做了以下操作:
创建一个带有窗口的新项目。在XIB编辑器中,向其添加一个NSPredicateEditor,并添加一行。将其保留为关键路径/字符串,并添加两个关键路径- "title"one_answers";writer"。不区分大小写和变音符。
创建NSWindowController的子类,并为谓词编辑器添加一个IBOutlet。
在awakeFromNib中,放入以下代码:
NSPredicate *myPredicate = [NSPredicate predicateWithFormat: @"(title CONTAINS[CD] %@) AND (writer 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不符合标准,当它涉及到谓词编辑。
有人有什么想法吗?我试过在代码中创建一个NSPredicateEditor,而不是XIB编辑器,无休止的混乱无济于事。谓词编辑功能是阻碍我将应用发布到商店的所有因素,所以这是一种烦恼。
我知道这不是您想听到的答案,但我强烈建议以编程方式设置谓词编辑器。根据我的经验,在IB中设置它不是很直观。至少在代码中你可以明确地看到发生了什么。
NSArray *keyPaths = @[[NSExpression expressionForKeyPath:@"title"],
[NSExpression expressionForKeyPath:@"writer"]];
NSArray *operators = @[@(NSEqualToPredicateOperatorType),
@(NSNotEqualToPredicateOperatorType),
@(NSBeginsWithPredicateOperatorType),
@(NSEndsWithPredicateOperatorType),
@(NSContainsPredicateOperatorType)];
NSPredicateEditorRowTemplate *template = [[NSPredicateEditorRowTemplate alloc] initWithLeftExpressions:keyPaths
rightExpressionAttributeType:NSStringAttributeType
modifier:NSDirectPredicateModifier
operators:operators
options:(NSCaseInsensitivePredicateOption | NSDiacriticInsensitivePredicateOption)];
NSArray *compoundTypes = @[@(NSNotPredicateType),
@(NSAndPredicateType),
@(NSOrPredicateType)];
NSPredicateEditorRowTemplate *compound = [[NSPredicateEditorRowTemplate alloc] initWithCompoundTypes:compoundTypes];
[myPredicateEditor setRowTemplates:@[template, compound]];
这似乎是xCode 4中的一个bug。当您记录由predicateEditor形成的谓词时,您将看到它听起来像
"日期"> =投(344464706.878616,"NSDate")
代替:
date>= CAST(344464706.878616, "NSDate")
第一种样式出现在xCode 4中,后者出现在xCode 3中。
我有同样的问题与XCode 4和NSPredicateEditor,所以它不只是你。我能够在XCode 3中打开我的代码,删除IB中的绑定并重新分配绑定,它正常工作。这与XCode 4设置绑定的方式有关——它似乎有bug。如果不能使用XCode 3,以编程方式设置可能是最好的答案。
在XCode4中遇到同样的问题,不幸的是我不能再用Xcode3的IB进行测试了。
从这里找到的样例http://nvie.com/posts/nspredicateeditor-tutorial/开始,我怀疑XCode4 IB有bug,因为通过IB在谓词编辑器中添加键盘并在DEFAULT_PREDICATE中添加条目会导致"警告-无法找到模板匹配谓词"。看看这个例子就明白了。似乎有什么已知的问题?也许我错过了什么…