1

私は経験の浅い Cocoa プログラマーであり、私の質問がドキュメントで何らかの形で回答されていて、単にそれを見逃していた場合、または NSPredicateEditor の動作について理解していないことがあった場合は、お詫び申し上げます。ただし、ドキュメントを検索してグーグルで検索しようとしましたが、ほとんど効果がありませんでした。したがって、私はあなたに質問をします。

NSPredicateEditor を使用して Core Data ベースのテーブル ビューをフィルタリングしようとしています。フィルタリングは、NSCompoundPredicate を作成することにより、さまざまな基準に基づいて行をフィルタリングするという点でうまく機能します。ただし、述語エディターの行の検索フィールドにテキストがない場合、返される NSPredicate は次のようなものになります。

dataName CONTAINS[cd] ""

...これは Core Data レコードのどれとも一致しません - 私が望むものではありません。その行の検索フィールドが空白の場合、基本的に、データ セットをフィルター処理したくありません。

私の質問は、述語のこれらの部分を無視するための最も簡単で最良の解決策は何ですか? 私の最初のアイデアは、 NSPredicateEditor の値を行ごとに解析し(NSPredicate *)predicateForRow:(NSInteger)row、述語を自分で再構築して、一致しようとしている行を無視すること""でしたが、それは不必要に面倒に思えます。最終的な NSCompoundPredicate を分解し- (NSArray *)subpredicatesてそのように編集することも、おそらく私のやり方が間違っているように思えます。これを行うよりエレガントな方法はありますか?

*明確にするために、現在NSPredicateEditorに保存されている最初の述語を実際に編集するのではなく、テーブルビューのコントローラーに渡す述語のコピーを編集することを考えています。

4

2 に答える 2

1

NSPredicateEditor をサブクラス化し、(NSPredicateEditor のスーパークラスである NSRuleEditor で宣言されている) オーバーライドし、そこで置換を行うことができるように見えますpredicateForRow:。基本的に、super の実装を呼び出すだけで、述語を調べて、必要に応じて新しく作成された述語を返します。

于 2010-01-13T19:04:16.033 に答える
0

Brian の考えは正しいと思いますが、Snow Leopard の下では、その述語を生成するためにNSPredicateEditor呼び出されません。-predicateForRow:上位レベルのメソッドをオーバーライドする必要がありますが-predicate、述語構造を調べて anilまたは空の stringとの比較を除外するのはまだかなり簡単constantValueです。

于 2010-01-15T23:19:20.590 に答える