2

NSPredicateEditor (NSRuleEditor のサブクラス) を使用して、NSPredicate を簡単に作成できます。私が知りたいのはこれです:

既存の NSPredicate (エディターによって作成されたもの) を取得し、エディターに再読み込みして変更できるようにするにはどうすればよいですか?

編集: setObjectValue: を使用するという @John の提案を試しましたが、うまくいきませんでした。私のセットアップをもう少し説明しましょう:

私はドキュメントベースのココア アプリを持っており、ドキュメント ウィンドウには NSPredicateEditor しかありません。dataOfType:error:メソッドには、次のものがあります。

NSPredicate * pred = [predicateEditor objectValue];
NSData * predicateData = [NSKeyedArchiver archivedDataWithRootObject:pred];
return predicateData;

readFromData:ofType:error:メソッドには、次のものがあります。

NSPredicate * pred = [NSKeyedUnarchiver unarchiveObjectWithData:data];
[predicateEditor setObjectValue:pred];
return (pred != nil);

述語が正しくアーカイブおよびアンアーカイブされることを確認しましたが、保存された述語を開いた後、述語が predicateEditor に読み込まれません。(はい、predicateEditor は IBOutlet として接続されています)

4

1 に答える 1

6

objectValueのプロパティをNSPredicateEditor問題の述語に設定します。

ドキュメントには、ロードプロセスのこの説明があります。これのいずれかがセットアップに問題を引き起こす可能性があるように見えますか?

最初に、NSPredicateEditor のインスタンスが作成され、いくつかの行テンプレートが nib ファイルまたはプログラムによって設定されます。述語エディターが最初に行うことは、templateViews を使用して、各テンプレートにビューを要求することです。

述語エディターをセットアップした後、通常、setObjectValue: メッセージを送信して、保存されている述語を復元します。NSPredicateEditor は、どのテンプレートが述語ツリーの各述語を表示するかを決定する必要があります。これは、各行テンプレートに matchForPredicate: メッセージを送信し、最も高い値を返すテンプレートを選択することによって行われます。

述語に最適な一致を見つけた後、NSPredicateEditor はそのテンプレートをコピーして新しいビューを取得し、それらを適切な行に挿入してから、setPredicate: を使用してテンプレートに述語を設定します。そのメソッド内で、NSPredicateEditorRowTemplate オブジェクトはそのビューの値をその述語を表すように設定する必要があります。

NSPredicateEditorRowTemplate は次に、displayableSubpredicatesOfPredicate: メッセージを送信して、テンプレートに述語の「表示可能なサブ述語」を要求します。テンプレートが述語全体を表す場合、または述語に副述語がない場合は、これに対して nil を返すことができます。それ以外の場合は、そのテンプレートの行のサブ行にする述語のリストを返す必要があります。副述語ごとにプロセス全体が繰り返されます。

于 2009-08-12T21:25:11.767 に答える