バインディングを持つ編集可能なNSTableViewは、モデルに値を設定しません
-
03-07-2019 - |
質問
これが私のセットアップです。
アプリケーションデリゲートには、currentFooというプロパティがあります。 currentFooプロパティは、現在選択されているFooインスタンスに設定されます。 Fooインスタンスにはそれぞれ、resultsというNSMutableArrayであるプロパティがあります。結果のオブジェクトは、NSNumber、NSStringなど、さまざまなタイプになります。
特定の時間に表示されるNSTableViewがあるので、ユーザーはcurrentFooの結果のコレクションを見ることができます。結果への追加と結果からの削除を可能にするUIもあります。
NSTableViewには、NSArrayControllerのarrangedObjectsコントローラキーにバインドされた単一の列があります。このバインディングで使用されるNSValueTransformerサブクラスを作成し、結果配列にあるさまざまなタイプを、テーブル列に表示する文字列表現に変換します。
NSArrayControllerのコンテンツ配列バインディングは、モデルキーパスとしてcurrentFoo.resultsを使用して、NSObjectControllerの選択コントローラーキーに接続されます。最後に、NSObjectControllerはアプリケーションデリゲートからコンテンツを取得します。
NSTableViewでcurrentFoo.resultsを追加、削除、表示すると、これはすべて正常に機能します。
私の問題は、Table Viewのコンテンツを編集しようとしたときです。 NSValueTransformerサブクラスを設定して逆変換を許可し、reverseTransformedValue:を実装しました。コードをステップ実行すると、NSTableView行の値を編集すると、値トランスフォーマーのメソッドに正しく送信され、変換されて返されます。
エラーが発生するのは、バインディングが逆変換された値でモデルを更新しようとしたときです。
ココアバインディング:エラー設定値 オブジェクト0のキーパス(境界から オブジェクト(null)):[setValue:forUndefinedKey:]: このクラスはキー値ではありません キーのコーディング準拠。
したがって、基本的にこの配列はテーブルビューにバインドされており、ユーザーが行を編集するときに、文字列を適切なオブジェクトに変換し直します。 Cocoaバインディングによりこのエラーが発生するため、NSTableColumnバインディングのキーパスに何かを設定する必要があると思われますが、何がわからないのですか。 「自己」を試しました。うまくいきませんでした。
ご協力いただければ幸いです。
解決
モデルキーを空にすることはできません。したがって、エラーメッセージが表示されます。
結果オブジェクトをプリミティブオブジェクト(文字列、ボックス番号など)から(FooResultクラスの)モデルオブジェクトに変更し、バインドのモデルキーパスを、使用するモデルオブジェクトのプロパティの名前に設定します。テーブルビューmutate。
基本的に、プリミティブオブジェクトの配列に直接バインドすることはできません。モデルオブジェクトの配列のプロパティにバインドする必要があります。