2

私はすでにこのテーマで1日を殺しましたが、これが正しい方法でどのように行われるのかまだわかりません。

私はNSOutlineViewファイルシステム階層を表示するために使用しています。最初の列の各行について、チェックボックス、関連するアイコン、およびファイルまたはディレクトリの名前を表示する必要があります。これを行う標準的な方法がないため、NSTextFieldCellSourceViewとPhotoSearchの両方の例を使用してサブクラス化しvalue、IBをnameツリーアイテムクラスのプロパティにバインドしましたNSTreeController。チェックボックスと画像をペイントするためにオーバーライドを使用してdrawWithFrame:inView:おり、テキスト描画をに転送していますsupertrackMouse:inRect:ofView:untilMouseUp:チェックボックスの相互作用を処理するためにオーバーライドも使用しています。

copyWithZone:カスタムセル内でマウスボタンを押すと、セルオブジェクトがコピーされ、この一時オブジェクトにtrackMouse:inRect:ofView:untilMouseUp:メッセージが送信され、元のセルのチェック状態を変更できないことに気付くまで、すべてが順調でした。見る。

質問の主題はバインディングに関するものなので、これが答えかもしれないと思いましたが、この混乱をすべて接続して期待どおりに機能させる方法がまったくわかりません。これを試しました:

[[[treeView outlineTableColumn] dataCell] bind:@"state"
                                      toObject:treeController
                                   withKeyPath:@"selection.state"
                                       options:nil];

しかし、まったく成功しませんでした。うまくいかないようです。

これは私が取った完全に間違った方法でしょうか?さらに読むためのより良い代替案またはリンクを提案できますか?


UPD 1/21/11:私もこれを試しました:

[[[treeView outlineTableColumn] dataCell] bind:@"state"
                                      toObject:treeController
                                   withKeyPath:@"arrangedObjects.state"
                                       options:nil];

しかし、「[<_ NSControllerTreeProxy 0x ...> valueForUndefinedKey:]:このクラスはキー状態のキー値コーディングに準拠していません。」のようなエラーが発生し続けました。および同様。

4

2 に答える 2

2

個々のデータセルの状態ではなく、テーブル(またはアウトライン)列の値をバインドします。データセルのオブジェクト値は、現在の行/列の値に設定されてから描画されるため、正当な理由なしに数千(または数百万?)のセルが作成される可能性はありません。

さらに、ツリーまたはアレイコントローラの選択ではなく、arrangedObjectsが必要です。

列の値をコントローラーキーとしてツリーコントローラーのarrangedObjectsにバインドし、IBのモデルキーパスとして「state」をバインドします。または、上記のコードの@"arrangedObjects.state"。

于 2011-01-20T21:47:24.970 に答える
1

さて、私は列valuearrangedObjectselfIBで)にバインドし、セルをオーバーライドして次のsetObjectValue:ようにすることで、必要なことを実行できました。

- (void) setObjectValue:(id)value
{
    if ([value isMemberOfClass:[MyNodeClass class]])
    {
        [super setObjectValue:[value name]];
        [self setIcon:[value icon]];
        [self setState:[value state]];
    }
    else
    {
        if (!value)
        {
            [self setIcon:nil];
            [self setState:NSOffState];
        }
        [super setObjectValue:value];
    }
}

実際のstate変更は別のクラス内で実行され、そのメソッドをselector(IB内の)セルに接続します。

[NSApp sendAction:[self action] to:[self target] from:[self controlView]];

セルからtrackMouse:inRect:ofView:untilMouseUp:。この別のクラスのメソッドは次のようになります。

- (IBAction) itemChecked:(id)sender
{
    MyNodeClass* node = [[sender itemAtRow:[sender clickedRow]] representedObject];
    if (node)
    {
        [node setState:[node state] == NSOnState ? NSOffState : NSOnState];
    }
}
于 2011-01-24T13:01:51.697 に答える