7

Xcode 4 の述語エディター コントロールに少し問題があります - 私はすべてを正しく行っていると思いますが、IDE 自体が壊れているようです。

私が書いているアプリでこの問題が発生していますが、それを特定するために、次のことを行いました。

ウィンドウで新しいプロジェクトを作成します。XIB エディターで、それに NSPredicateEditor を追加し、1 行追加します。キーパス/文字列のままにして、「タイトル」と「ライター」の 2 つのキーパスを追加します。大文字と小文字を区別しないようにします。

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] 警告 - テンプレートに一致する述語ライターが見つかりません [cd] ""

(+) ボタンをクリックして新しい行を追加すると、次のようになります。

2011-04-12 15:59:40.044 PredicateTest[38419:903] nil 演算子または式で比較述語を作成できません。

ここで何も悪いことをしていないと思うのは正しいですか、これはうまくいくはずですか? 述語エディターの行テンプレートをキー パスから変更してからキー パスに戻し、キー パスのリストを編集すると、Xcode が内部整合性例外でクラッシュします。述語編集になります。

誰でもアイデアはありますか?私は 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 に答える