0

以下に示すNSString*fileNameとNSDictionary*framesの2つのプロパティを持つクラスがあります。

  • NSDictionary*フレーム
    • キー:NSString
    • 値:フィールドディクショナリのインスタンス
  • NSDictionary*フィールド
    • キー:NSNumber(C ++列挙値)
    • 値:NSValue(C ++オブジェクトポインター)

各ファイルを一覧表示するNSTableViewを使用してマスター/詳細ビューを作成したいと思います。最初の列のfileNameは、バインドするのは簡単ですが、詳細ビューの列やフィールドをフィールドサブディクショナリの値にバインドする方法がわかりません。

とにかくC++オブジェクトメソッドにバインドできないと思います。フィールドサブディクショナリの値にカスタムコントローラが必要だと思っています。使用しているC++ライブラリごとに列挙型で定義されたタイプに適したメソッドを呼び出して列挙型キーでフィールド値にアクセスできるように、カスタムコントローラーをKVCに準拠させることは可能でしょうか?

または、各フィールドのデータをフィールドディクショナリの値として保存する必要がありますか?GUIで値を変更した後、とにかく辞書を処理するメソッドを実行する必要があります。その時点で、C ++フィールドオブジェクトを再構築し、適切なメソッドを呼び出すことができます。

とにかく、私の課題は、ネストされた辞書のバインディングを理解することです。

4

2 に答える 2

1

NSControllerとその仲間をサブクラス化することは、ここでの最善のアプローチではない可能性があります。

それを回避する方法はありません。すべてのバインディングが基づくAPIであるKey/Value Codingは、NSNumbers(またはその他のタイプ)ではなく、NSStringsであるkeys/keyPathsに依存しています。NSNumberキーの使用からNSStringキーの使用に切り替えた場合、これはおそらくはるかに簡単です。そこにたどり着くのは、文字列と列挙値の間を行き来するswitchステートメントを使用して2つの関数を実装するのと同じくらい簡単かもしれません。

C ++オブジェクトへのポインタに対してバインドする見込みがないことはすでに理解しているので、以下の説明では、値をディクショナリにベイクしたことを前提としています。何らかの理由で、フィールドディクショナリでNSStringキーの使用に切り替えることができない場合は、NS [Mutable] Dictionaryをサブクラス化してオーバーライド-valueForUndefinedKey:-setValue:forUndefinedKey:、この変換を実行することもできます。NS [Mutable] Dictionaryのサブクラス化は、これらのクラスがクラスクラスターによってサポートされているため、気の弱い人向けではありません。ドキュメントにはサブクラッサーのすべての要件が明確に列挙されているため、ここでは取り上げません。さらに、実装では、NSNumberキーで行われた変更に対応する文字列キーの通知を必ず-setObject:forKey:送信する必要があります。-willChangeValueForKey:-didChangeValueForKey:

std::hash_map<enum, ptr>最終的にこれらすべてをまたは他のC++クラス/構造体に格納することを好むと仮定すると、Objective-Cにブリッジする論理的なアプローチは、STL hash_mapをラップし、NSStringキーを使用してKVC/KVOセマンティクスを提供する新しいモデルクラスを作成することです。 、上記と同様に翻訳を処理します。

于 2012-12-05T03:57:56.450 に答える
0

各フィールドのデータを「フィールド」サブディクショナリの値として保存することになりました。値にバインドするキーパスを指定できることに気づきませんでした。

たとえば、質問で説明したように、メンバー NSDictionary の「フレーム」を持つオブジェクトのセットを含むメンバー NSArray の「トラック」を持つクラスがあります。「トラック」は、NSTableView がバインドされている NSArrayController を使用して GUI で表されます。

NSTableView 内で、モデル キー パス「objectValue.frames.key1.key2」を使用して、テーブル セルの静的テキストをテーブル セル ビューにバインドできます。

同様に、マスター/詳細ビューの詳細部分では、「selection」をコントローラー キーとして、「frames.key1.key2」をモデル キー パスとして、テキスト フィールド セルを NSArrayController にバインドできます。

于 2012-12-09T00:31:09.690 に答える