0

NSArrayControllerを介してNSMutableArrayにバインドするNSTableViewがあります。配列には派生クラスがあります。テーブルの最初の数列は、基本クラスに存在するプロパティにバインドされています。それはすべてうまくいきます。

問題が発生しているのは、行が1つの特定のサブクラスにマップされている場合にのみ入力する必要がある列です。列が表示することを意図したプロパティは、基本クラスの観点からは意味がないため、そのサブクラスにのみ存在します。ユーザーは、最初の2つの列から、3番目の列のセルが入力/編集可能であるかどうかを知ることができます。

3番目の列の値のバインディングはarrangedObjectsにあり、「foo.name」のようなモデルパスがあります。ここで、fooはサブクラスのプロパティです。ただし、階層内の他のサブクラスはfooのキー値に準拠していないため、これは機能しません。

私の唯一の選択は、fooを基本クラスのプロパティにして、全員がそれに応答するようにすることだと思われますが、これにより、モデルオブジェクトのインターフェイスが乱雑になります。

誰かがこの状況のた​​めのすっきりとしたデザインを思いついたことがありますか?それは珍しいことではありません(私はCocoaの比較的新参者であり、バインディングの詳細を学んでいます)。

4

1 に答える 1

1

これを解決する 1 つの方法は、バインドが機能する最初の 2 つの列にのみバインディングを使用することです。残りの列については、必要なカスタム ロジックを実装する NSTableViewDataSource を実装します。

最初に実装する新しいクラスを作成します

-tableView:objectValueForTableColumn:row:
-tableView:setObjectValue:forTableColumn:row:

(ユーザーが他の列を編集することになっている場合は、2 番目のみが必要です)。次に、

IBOutlet NSArrayController *valuesController;

そのクラスへのインスタンス変数。

Interface Builder 内で、そのクラスの新しいオブジェクトを追加します (青い「オブジェクト」立方体をライブラリからファイルのウィンドウにドラッグします)。アレイ コントローラを新しいデータ ソースに接続します。次に、データ ソースをテーブル ビューに接続して、テーブル ビューのデータ ソースにします。

最初の 2 つを超える列が何にもバインドされていないことを確認してください。

-tableView:objectValueForTableColumn:row:

メソッドは必要に応じてこれらの列に対して呼び出され、必要に応じてオブジェクトを確認できます。

- (id)tableView:(NSTableView *)aTableView
   objectValueForTableColumn:(NSTableColumn *)aTableColumn
                         row:(NSInteger)rowIndex;
{
    NSObject *myObject = [[valuesController arrangedObjects] objectAtIndex:rowIndex];
    id columnIdentifier = [aTableColumn identifier];
    if ([columnIdentifier isEqual:@"foo"]) {
        if ([myObject respondsToSelector:@selector(fooValue)]) {
            return [myObject fooValue];
        }
    }
    return nil;
}

列識別子を使用して、要求されている列を確認する方法に注意してください。Interface Builder 内で列識別子を設定します。

于 2010-06-01T01:18:31.420 に答える