0

カスタムビューのバインドされたプロパティに問題があります。プロパティは、コアデータエンティティのNSArrayControllerにバインドされています。

ここに問題があります:

私の見解では、いくつかの長方形を描きます。これらの長方形の位置は、コアデータのエンティティに保存されます(NSValueでラップされたNSRectsとして)。長方形はドラッグ可能です。長方形をドラッグすると、エンティティが新しい位置に更新されます。しかし、arrayControllerをビューにバインドする方法がわかりません。

すべてがどのように接続されているかを次に示します。

  • ビューとarrayControllerへのアウトレットを備えたwindowControllerがあります。

  • arrayControllerは、windowControllerのmanagedObjectContextにバインドされているため、コアデータモデルにバインドされています。(そのバインディングとエンティティへのバインディングはInterface Builderで確立されます)

  • ビューは、ivar「rectangleValuesArray」を使用してarrayControllerにバインドされます

その最後のバインディングは、以下を使用してwindowControllerで確立されます。

[connectionsView bind:@"rectangleValuesArray"
             toObject:elementsArrayController
          withKeyPath:@"arrangedObjects.rectangleValue"
              options:nil];

これまでのところうまくいきます。

今、私は反対方向のバインディングを確立しようとしました:

[elementsArrayController bind:@"arrangedObjects.rectangleValue"
                     toObject:connectionsView
                  withKeyPath:@"rectangleValuesArray"
                      options:nil];

これで、ivarを変更すると、エンティティが更新されます(右?)。しかし、それは機能しません-私はコンソールからそれを取得します:

Cocoa Bindings: Error setting value for bound property arrangedObjects.rectangleValue of object <NSArrayController: 0x200027100>[entity: Element, number of selected objects: 1]: [<NSArrayController 0x200027100> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key arrangedObjects.rectangleValue.

ここで何が間違っているのですか?誰か助けてくれませんか?

サイモン

4

2 に答える 2

2

いくつかのこと。

まず、例外は正しいです。NSValueオブジェクトの長方形の値を設定することはできません。それらは不変です。

長方形の配列がその1つである、並列配列を維持しようとしているようです。そうしないでください。バインディングはそれに窒息し、AppleScriptのサポートもはるかに難しくなります。

あなたがする必要があるのは、モデルオブジェクトを実装し、それらの単一の配列を保持することです。長方形の配列を含め、現在持っている配列はすべて、モデルオブジェクトのプロパティになる必要があります。各配列には、とりわけ長方形があります。

もう1つは、コントローラーをビューにバインドしないことです。ビューをコントローラーにバインドします。すでにそれを行ったので、あなたは完了です。

可能であれば、コードではなくIBでこれを設定することも検討してください。IBの使用に抵抗しないでください。それはあなたの友達です。

于 2010-08-22T11:15:49.273 に答える
0

私があなたがそこでしていることに従うかどうかは完全にはわかりませんが、あなたはこのアプローチを検討しましたか?

  • ビューIBOutlet NSArrayController* myArrayControllerにアレイコントローラーのivarを指定し(すでにそのようなものがある可能性があります)、IBでその接続を設定します
  • ウィンドウコントローラからの2つの手動バインディング呼び出しを省略します

ここで、ビュー内からアレイコントローラーの内容を変更するには、を呼び出し[myArrayController mutableArrayValueForKeyPath:@"arrangedObjects.rectangleValue"]ますこれにより、KVOの更新で自由に変更できるキーパスへのプロキシが提供されます。

それが完全に要点を超えていないことを願っています。

于 2010-08-22T11:14:34.357 に答える