2

Cocoa プロジェクトを手動で同期されたインターフェイス モデルからバインディング モデルに変換するのに問題があるため、インターフェイスのグルー コードについて心配する必要はありません。

CocoaDevCentral Cocoa Bindings チュートリアルに従って、すべての基本をカバーしていることを確認しましたが、正しく動作しません。マスター/ディテール インターフェースを使用していますが、インターフェースのマスター部分を正しく動作させることさえできません。チュートリアルに示されている方法と同様のバインディング モデルを設定したにもかかわらず、マスター カラムにデータが表示されません。すべてのコントローラーとオブジェクトが-(id)key-(void)setKey:(id)keyメソッドをバインドに準拠するように変更し、nib に ControllerAlias オブジェクトを作成し、それをコントローラーに接続し、ControllerAlias が接続するクラスの NSMutableArrays の 1 つにバインドする NSArrayController を作成しました。配列内に含まれるオブジェクトの型を調べてから、テーブルの列を NSArrayController にバインドしました。

コンソールにエラーNSBindingDebugLogLevelはまったく表示されず、1 に設定してもエラーは発生しません。これは、問題が何であるかを理解するのに役立ちます。

物事が正しく機能していることを確認するために私が考えることができる唯一のことは、NSArrayController に接続する NSMutableArray に実際に何かが含まれていることを確認することです。

助言がありますか?Cocoa バインディングには他に、チェックすべき典型的な落とし穴はありますか?

4

3 に答える 3

1

key: メソッドにブレークポイントを設定して、呼び出されているかどうかを判断しましたか? そうでない場合は、テーブル列のバインディングに対して何かが正しく設定されていないことを示しています (配列にアイテムが含まれていることを確認したため)。

もうオブジェクト コントローラーを作成する必要はないと思います (そのチュートリアルは少し古くなっています)。NIB でオブジェクトを作成し、そのクラスを Controller クラスに設定するだけです。ObjectController の代わりに、バインディングを直接設定できます。

バインディングを設定するには、次のようにします。

  1. NIB にコントローラーのインスタンスを作成します。
  2. NSArrayController を作成し、コントローラーの配列にバインドします。
  3. テーブルの列ごとに、配列コントローラーのオブジェクトのメンバーに値をバインドします。

あなたがする必要があるのはそれだけです - 私はバインディングが数バージョン前に最初に導入されて以来、彼らはこれをかなりきれいにしたと思います.

于 2008-11-09T04:33:29.343 に答える
0

nib に ControllerAlias オブジェクトを作成しました。

「コントローラエイリアス」とは何ですか? これはモデル、コントローラー、またはビューですか?

それを私のコントローラーに接続し、

どう言う意味ですか?

ControllerAlias が接続するクラスの NSMutableArrays の 1 つにバインドする NSArrayController を作成し、

クラスには s がありませんNSMutableArray

バインドした配列コントローラーのプロパティは何ですか?

どのオブジェクトにバインドしましたか?

そのオブジェクトのどのキー パスにバインドしましたか?

…そして、テーブルの列を NSArrayController にバインドしました。

テーブル列のどのプロパティをバインドしましたか?

配列コントローラーのどのプロパティ (キー パス) にバインドしましたか?

于 2008-11-09T04:48:18.207 に答える
0

したがって、元のコードでは、配列 (NSArrayController が表していた) を init ではなく awakeFromNib で変更していたため、キー値を観察して配列を変更していなかったので、変更がインターフェイスに反映されていませんでした。方法。

からコードを変更しました

theArray = [[NSMutableArray alloc] init];
[theArray addObject:newThing];

に:

theArray = [[NSMutableArray alloc] init];
NSMutableArray *bindingsCompliantArray = [self mutableArrayValueForKey:@"things"];
[bindingsCompliantArray addObject:newThing];

-(void)awakeFromNib メソッドの代わりに -(id)init メソッドでロードするのが他の解決策だと思いますが、それにはより大きなリファクタリングが必要だったので、私はそれをしませんでした。

NSArrayController を介して配列リストに新しいものを作成するボタンを追加することでこれを理解しました。ボタンをクリックすると、新しいものが配列に追加され、既存の配列も魔法のように表示されました。

于 2008-11-09T06:04:34.870 に答える