0

NSOutlineView に 2 つの列があります。1 つは Text and image セルです (DragNDropOutlineView Apple サンプル コードのクラスに似ています)。その隣には、「XFToggleCell」と呼ばれるカスタム NSCell サブクラスがあり、オンとオフを切り替えることができる可視性アイコン (眼球) を表示するために使用されます (Photoshop と同様)。

XFToggleCell は、マウス トラッキング/ドラッグ (これも Photoshop と同様) をサポートしているため、1 つの目玉をクリックしてから下にドラッグすると、一度に複数のアイテムを表示/非表示にすることができます。テキストと画像のセルでは、アイテムが非表示の場合はテキストを灰色で表示し、非表示の場合は黒で表示します。

ほとんどすべてが正常に機能しています。目玉 (XFToggleCell) をクリックすると、画像が消えてモデル オブジェクトが非表示になります。ただし、トグルセルをもう一度クリックするまで、隣接するテキストと画像セルのフォントは灰色になりません(更新されません)...そして、そうすると、画像とテキストセルのテキストの色は常に何の反対になりますそうである必要があります (可視性をクリックすると、テキストが灰色になり、その逆も同様です)。

これが発生する理由は、トグル セルの値が変更される前にテキストと画像のセルが再描画されているためだと判断しました。その結果、その表示は常に「1 クリック後」になります。シーケンスは次のようになります。

  1. 列 1 のトグル セルをマウスダウンします。
  2. 列 0 のテキストと画像のセルが再描画されます。
  3. 列 1 のトグル セルのオブジェクト値が変更されます。
  4. 列 1 のトグル セルが再描画されます。

上記の手順 5 のように、列 0 のテキストと画像のセルを強制的に再描画できれば、問題ありません。

列 1 のセルをクリックした結果、列 0 のテキストと画像セルの描画を強制的に更新するにはどうすればよいですか?

これが私が重要なメソッドだと思うものの実装です...列1にある私のXFToggleCell.mでは:

- (BOOL)startTrackingAt:(NSPoint)startPoint inView:(NSView *)controlView
{
    .
    .
    .
    ...do some stuff...
    .
    .
    .
    //Here's where I change the cell's object value, causing the cell to be redrawn.
    //This part works fine.
    [self setObjectValue:([self.representedObject newState]) ? self.image : nil];
    .
    .
    .
    //Why doesn't this next line update the adjacent cell?!?!?!?!?
    //Column 0 contains the text and image cell I'm trying to update
    [controlView setNeedsDisplayInRect:[(NSOutlineView *)controlView frameOfCellAtColumn:0 row:thisRow]];
    }
    return YES;
}
4

1 に答える 1

2

理由はよくわかりませんが、

[(NSOutlineView *)controlView setNeedsDisplayInRect:[(NSOutlineView *)controlView frameOfCellAtColumn:col row:row]];

の最後に置いたときに機能しませんでした

-(BOOL)startTrackingAt:(NSPoint)startPoint inView:(NSView *)controlView

私の XFToggleCell クラスで。

なので追加してみました

[outlineView setNeedsDisplayInRect:[outlineView frameOfCellAtColumn:col row:row]];

私の最後に

-(void) outlineView:(NSOutlineView *)outlineView setObjectValue:(id)object forTableColumn:(NSTableColumn *)tableColumn byItem:(id)item

私の NSOutlineView データソースのメソッドで、うまくいきました。理由はわかりませんが、これがその方法です。セル内で本質的に同じことを呼び出しても機能しなかった理由を誰かが明らかにできる場合は、情報をいただければ幸いです。

于 2012-06-15T01:48:44.213 に答える