objective C语言 NSPredicateEditor in Xcode 4



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中添加条目会导致"警告-无法找到模板匹配谓词"。看看这个例子就明白了。似乎有什么已知的问题?也许我错过了什么…

相关内容

最新更新