NSOutlineView に 2 つの列があります。1 つは Text and image セルです (DragNDropOutlineView Apple サンプル コードのクラスに似ています)。その隣には、「XFToggleCell」と呼ばれるカスタム NSCell サブクラスがあり、オンとオフを切り替えることができる可視性アイコン (眼球) を表示するために使用されます (Photoshop と同様)。
XFToggleCell は、マウス トラッキング/ドラッグ (これも Photoshop と同様) をサポートしているため、1 つの目玉をクリックしてから下にドラッグすると、一度に複数のアイテムを表示/非表示にすることができます。テキストと画像のセルでは、アイテムが非表示の場合はテキストを灰色で表示し、非表示の場合は黒で表示します。
ほとんどすべてが正常に機能しています。目玉 (XFToggleCell) をクリックすると、画像が消えてモデル オブジェクトが非表示になります。ただし、トグルセルをもう一度クリックするまで、隣接するテキストと画像セルのフォントは灰色になりません(更新されません)...そして、そうすると、画像とテキストセルのテキストの色は常に何の反対になりますそうである必要があります (可視性をクリックすると、テキストが灰色になり、その逆も同様です)。
これが発生する理由は、トグル セルの値が変更される前にテキストと画像のセルが再描画されているためだと判断しました。その結果、その表示は常に「1 クリック後」になります。シーケンスは次のようになります。
- 列 1 のトグル セルをマウスダウンします。
- 列 0 のテキストと画像のセルが再描画されます。
- 列 1 のトグル セルのオブジェクト値が変更されます。
- 列 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;
}