質問

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

私は使用しています NSOutlineView ファイルシステムの階層を表示します。最初の列の各行について、チェックボックス、関連するアイコン、ファイルまたはディレクトリの名前を表示する必要があります。これを作成する標準的な方法がないので、私はサブクラス化しました NSTextFieldCell ソースビューとPhotosearchの両方の例を使用して、バインディング value IBで name しかし、私のツリーアイテムクラスのプロパティ NSTreeController. 。私は使用しています drawWithFrame:inView: チェックボックスと画像をペイントするためにオーバーライドし、テキスト描画を転送します super. 。私も使用しています trackMouse: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];

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

役に立ちましたか?

解決 2

さて、私は列のバインディングによって必要なことをすることができました valuearrangedObject's self (IB)およびオーバーライドセル 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];
    }
}

他のヒント

個々のデータセルの状態ではなく、テーブル(または概要)列の値にバインドします。データセルのオブジェクト値は、現在の行/colの値に設定され、その後、潜在的に数千(または数百万)のセルが作成されないように描画されます。

さらに、ツリーまたはアレイコントローラーが必要です ArractedObjects, 、その選択ではありません。

バインドします 列の ツリーコントローラーの価値 ArractedObjects コントローラーキーとして、およびIBのモデルキーパスとして「状態」。または、上記のように @"ArrangedObjects.state" Codeで。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top