7

Xcode 4 的谓词编辑器控件有点问题 - 我认为我做的一切都是正确的,而且 IDE 本身似乎真的被破坏了。

我正在编写的应用程序中遇到此问题,但为了隔离它,我执行了以下操作:

创建一个带有窗口的新项目。在 XIB 编辑器中,添加一个 NSPredicateEditor 到它,并添加一行。将其保留为关键路径/字符串并添加两个关键路径 - “标题”和“作者”。使其大小写和变音不敏感。

创建 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] 警告 - 无法找到模板匹配谓词标题包含 [cd] ""

2011-04-12 15:59:37.710 PredicateTest[38419:903] 警告 - 无法找到模板匹配谓词 writer CONTAINS[cd] ""

当我单击 (+) 按钮添加新行时,我得到以下信息:

2011-04-12 15:59:40.044 PredicateTest[38419:903] 无法使用 nil 运算符或表达式创建比较谓词。

我是否认为我在这里没有做错任何事情,这应该有效吗?如果我将谓词编辑器行模板从关键路径更改,然后将其切换回关键路径,并编辑关键路径列表,Xcode 崩溃并出现内部一致性异常,这让我认为 Xcode 4 可能不符合标准它涉及谓词编辑。

有人有什么想法吗?我尝试在代码而不是 XIB 编辑器中创建一个 NSPredicateEditor,并且无休止地胡闹无济于事。谓词编辑功能阻碍了我向商店发布应用程序,所以这有点烦人。

4

4 回答 4

13

我知道这不是您想听到的答案,但我强烈建议以编程方式设置谓词编辑器。根据我的经验,在 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]];
于 2011-04-13T03:05:15.710 回答
3

这似乎确实是 xCode 4 中的一个错误。当您记录由 predicateEditor 形成的谓词时,您会看到它听起来

“日期”> = CAST(344464706.878616,“NSDate”)

代替:

日期> = CAST(344464706.878616,“NSDate”)

第一种样式出现在 xCode 4 中,后者出现在 xCode 3 中。

于 2011-12-05T20:45:50.087 回答
1

我对 XCode 4 和 NSPredicateEditor 也有同样的问题,所以不仅仅是你。我能够在 XCode 3 中打开我的代码,删除 IB 中的绑定并重新分配绑定,它工作正常。它与 XCode 4 设置绑定的方式有关——它似乎有问题。如果 XCode 3 不是一个选项,以编程方式设置它可能是最好的答案。

于 2011-04-18T00:37:22.200 回答
0

在 XCode4 上遇到同样的问题,不幸的是我不能再用 Xcode3 的 IB 进行测试了。

从此处找到的示例开始http://nvie.com/posts/nspredicateeditor-tutorial/我怀疑 XCode4 IB 有错误,因为通过 IB 在谓词编辑器中添加键路径并在 DEFAULT_PREDICATE 中添加条目会导致“警告 - 无法查找模板匹配谓词”.. 检查此示例以了解 ;) 似乎存在已知问题?也许我错过了一些东西..

于 2011-04-15T12:05:20.493 回答