問題は、-editColumn:row:withEvent:select:が送信されたときに、NSTableViewによって白い背景が描画されることです。セルの長方形を+[NSColortextBackgroundColor]で塗りつぶします。
開発者の色空間から名前付き色の現在の設定をオーバーライドするためのパブリックAPIがある場合は、-editColumn:row:withEvent:select:などのオーバーライド内に設定できます。私はそのようなAPIを思い出しません(ポインターは大歓迎です)。また、このコードはSnow Leopardでのみテストしました(以下のLeopard SDKの補遺でも)。サポートする予定の実際のSDKおよびランタイム環境に対してコードを確認します。
NSTableViewには、塗りつぶしの色に使用するプライベートアクセサーがありますが、これは読み取り専用のプロパティです。セッターがないため、標準のNSTableViewの値を変更することはできません。サブクラス化する必要があります。(outlineViewで同じ動作が必要であり、NSOutlineViewはすでにNSTableViewのサブクラスであるため、NSOutlineViewをサブクラス化します。ただし、スーパークラスを除いて、コードは同じです。)
@interface ASCOutlineView : NSOutlineView {
}
@end
@implementation ASCOutlineView
- _textBackgroundColor
{
return ([NSColor clearColor]);
}
@end
Snow Leopardでテーブルセルを編集するときに、そのまぶしい白いブロックがHUDを台無しにするのを防ぐために必要なのはすべてのようです。
ただし、Leopard SDKに対してコンパイルされたアプリには、もう少しサポートが必要です。LeopardのtableViewsには、一部のレンダリングプロパティがハードコーディングされている可能性があるため、choiceメソッドをオーバーライドする必要があります。
NSTextFieldCellsは、実際にはNSTextViewsのラッパーであるため、コントロール内で使用できます。これらは通常、ウィンドウ(またはこの場合はそのサブクラスであるパネル)によって管理される同じtextViewインスタンスを共有します。NSTableViewは、データを編集するためのシステムUI設定に準拠するようにNSTextFieldCellの設定を変更します。多くの場合。次に、NSTextFieldCellはそれらの設定をNSTextViewに伝播します。このパイプラインに沿った任意の時点で、1つまたは2つのメソッドをオーバーライドして、独自のUIに一致するようにこれらのプロパティの値を変更できます。
-[NSTextFieldCell setDrawsBackground:]を使用します。これは、修正するのにほとんど労力を必要としないためです。また、他のオブジェクトがその状態に依存する可能性がある場合に、内部状態を達成したいと考えている効果と一致させることも重要です。
@interface ASCTextFieldCell : NSTextFieldCell {
}
@end
@implementation ASCTextFieldCell
- (void)setDrawsBackground: (BOOL)flag
{
[super setDrawsBackground: NO];
}
@end
また、セルの編集中にフォーカスリングが表示されないようにするのは、フォーカスリングタイプの設定を変更するだけです。苛立たしいことに、IBはこのプロパティへのアクセスを提供しないため、プログラムで実行する必要があります。
for(eachColumn in [hudOutlineView tableColumns])
{
columnCell = [[ASCTextFieldCell alloc] initTextCell: @""];
[eachColumn setDataCell: columnCell];
if([columnCell respondsToSelector: @selector(setFocusRingType:)] != NO)
[(NSTextFieldCell *)columnCell setFocusRingType: NSFocusRingTypeNone];
}