2011-01-25 4 views
0

私はカスタムコントロールを作成するためにサブクラスNSTextFieldを割り当てました。カスタムコントロールのプロパティ(NSArray)をNSArrayControllerにバインドします。しかし私はコントロールから配列をNSArrayControllerに伝播する方法を知らない。 NSArrayControllerで使用しているキーパスはarrangedObjects.nameです。私は配列(@"One", @"Two", @"Three")を伝播しようとしていると私は単純に使用している場合たとえば、:カスタムコントロールをNSArrayControllerにバインドします

[boundObject setValue:myArray forKeyPath:@"arrangedObjects.name"] 

それは、アレイ(@"One", @"Two", @"Three")arrangedObjects.nameの各要素の値を設定します。何が起こるしたいことなど、@"One"@"Two"に設定された第2の値をarrangedObjects.nameセットの最初の要素を持つことである

NSTableColumnはこれを行いますので、私はそれが可能だけど、私はそれがどのように把握することはできません実装されました。

これを達成する最もよい方法は何ですか?

+0

新しいカスタムプロパティに関する情報をもう少し提供する必要があります。詳しく教えてください。 –

+0

これはKVOに準拠した 'customContent'(より良い名前がないため)と呼ばれる単純なNSArray *です。私はそれを 'NSArrayController'(双方向)にバインドできるようにしたいと思います。しかし、私が実際にやることができるのは、 'NSArrayController'に' arrangedObjects.name'キーパスを(上記のように)正しく設定することだけです。 –

答えて

0

私は自分の質問に答えてくれたかもしれません。誰かが私にこれを行うより良い方法を教えてくれるのであれば、すぐに正しい答えとしてマークしません。この方法はかなりハックです。 http://www.cocoadev.com/index.pl?NSArrayController言う:

とにかく、私はここにNSArrayControllerは約読んでいた(予想通り)アレイコントローラに送信され

valueForKeyPath:@"arrangedObjects.name"場合、1は名前値の配列を返す取得しますが、別のオブジェクトの複製物であればこの動作と表の列の値はこのオブジェクトにバインドされ、各行の配列全体が表示されます。

あなたはarrangedObjects.someKeyNSTableColumnの値をバインドします。配列コントローラでvalueForKeyPath:@"arrangedObjects.someKey"をプログラムで呼び出そうとすると、配列arrangedObjectsvalueForKey:@"someKey"を呼び出した結果の配列が返されます。これはすべて問題ありません。ですから、NSTableColumnの値を私のオブジェクトsomeArray.someKeyにバインドすることもできますが、これは(いくつかのレベルでは)機能しません。

だから、基本的に、それは右のように動作し、私のカスタムコントロールをしない理由でNSArrayControllerarrangedObjectsためNSTableColumn特別な場合にそのバインディングのように聞こえます。

これはあまり柔軟ではないようですが、それが実際に動作するように私が見つけることができる唯一の方法です。私はNSArrayControllerとarrangedObjectsのバインディングに特殊なケースを実装していましたが、私が望むように動作させることができました。

もっと良い解決策がありがとうございます。

+0

実装の詳細がわからないと、NSTextFieldに配列を格納するのが間違っていると言えます。通常、コンテンツはコントローラによって保存され、管理されます。テキストフィールドは、単にユーザーとコントローラの間のコンテンツのコンジットにする必要があります。たとえば、NSTextFieldがあり、コンマで区切られた一連の値(基本配列)を入力するようユーザーに依頼するとします。私は、テキストフィールドから文字列を取得し、コントローラで内容を解析して保存するコントローラを用意しています。 – sosborn

関連する問題