2011-01-20 10 views
2

私はすでにこの件について1日を殺しましたが、これはどうして正しい方法でこれを行うことができるのかまだ分かりません。単一のNSCellを複数の値にバインドする

NSOutlineViewを使用してファイルシステムの階層を表示しています。最初の列の各行について、チェックボックス、関連するアイコン、ファイルまたはディレクトリの名前を表示する必要があります。これを行うための標準的な方法はないので、NSTextFieldCellをSourceViewと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]; 

のが、「のようなエラーが取得保管[< _NSControllerTreeProxyの0x ...> valueForUndefinedKeyを:]:このクラス鍵の状態のコード化に準拠した鍵価値ではない」類似しています。

答えて

1

さて、私は次のようにそれが見えるように、私は結合列のvaluearrangedObjectselfに(IB中)とオーバーライドセルのsetObjectValue:で必要なものを行うことができました別のクラス内で、セルのselector(IBで)私は、セルのtrackMouse:inRect:ofView:untilMouseUp:から

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

を使用して呼び出すこれにその方法を接続します。これは、別のclass'esメソッドは次のようになります。

- (IBAction) itemChecked:(id)sender 
{ 
    MyNodeClass* node = [[sender itemAtRow:[sender clickedRow]] representedObject]; 
    if (node) 
    { 
     [node setState:[node state] == NSOnState ? NSOffState : NSOnState]; 
    } 
} 
2

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

さらに、ツリーまたはアレイコントローラのには、オブジェクトの選択ではなく、という配列を指定します。

バインドIBにおけるモデルキーパスとして制御キー、及び「状態」としてツリーコントローラのarrangedObjectsから列の値。または@ "arrangedObjects.state"を上記のように記述します。実際state変更が行われた

- (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]; 
    } 
} 

+0

ええ、それは私が[値]-'name'が最初の場所で結合 'の話を意味したものです:私はすでに、[値]'に 'arrangedObjects.name'バインドを持っていますそのため、同時に 'arrangedObjects.state'にバインドすることはできません(また、' state'バインディングも使用できません)。どのように可能ですか?.. –

+0

*ああ!*申し訳ありません!チェックボックスのボタンセルでは可能ではないと私は信じています。バインディングを使用する場合は、チェックボックスのボタンセル自体(タイトルなし)に別の列を使用する必要があります。 –

関連する問題