防止 NSTableRowView 在不处于焦点时更改突出显示?

Prevent NSTableRowView from changing highlight when not in focus?

我在左窗格中有一个带有 table 视图的 NSSplitView。我注意到,当我在左窗格中选择了一个项目并将焦点转移到右窗格时,左窗格失去焦点并且突出显示的行的突出显示颜色变为灰色并且文本变为黑色。

我已经通过重写 NSTableRowView 中的 drawSelectionInRect 来重写高亮颜色。通过这样做,突出显示颜色保持相同的自定义颜色,但文本变暗看起来不对。

我能否在 table 视图失焦时改变高亮颜色,或者防止文本在失焦时变暗?

当您在拆分视图中单击另一个视图时,OS X 似乎会在行视图及其子视图上调用 setBackgroundStyle。有趣的是,它似乎只发生在 NSOutlineView 上。

因为我已经准备好代码来处理在选择行时将我的图像更改为不同的图像(以提高对比度),并且当我需要使用 outlineViewSelectionDidChangeoutlineViewSelectionIsChanging 我将 setBackgroundStyle 覆盖为空操作,并且我制作了自己的自定义 setter,它更改了 _backgroundStyle ivar。

看起来像这样:

@implementation TextFieldWithHighlighting
@synthesize backgroundStyle = _backgroundStyle;
- (NSBackgroundStyle) backgroundStyle {
    return _backgroundStyle;
}
@synthesize secretBackgroundStyle = _secretBackgroundStyle;
- (NSBackgroundStyle) secretBackgroundStyle {
    return _backgroundStyle;
}

- (void)setBackgroundStyle:(NSBackgroundStyle)backgroundStyle {

}

- (void) setSecretBackgroundStyle:(NSBackgroundStyle)secretBackgroundStyle {
    _backgroundStyle = secretBackgroundStyle;
    self.needsDisplay = YES;
}


- (void)drawRect:(NSRect)dirtyRect {
    if(_backgroundStyle == NSBackgroundStyleDark) {
        if(self.originalTextColor == nil) {
            self.originalTextColor = self.textColor;
        }
        self.textColor = [NSColor whiteColor];
    } else {
        if(self.originalTextColor) {
            self.textColor = self.originalTextColor;
        } else {
            self.textColor = [NSColor colorWithCalibratedRed:0x40/255.0 green:0x40/255.0 blue:0x41/255.0 alpha:0xFF/255.0];
        }
    }
    [super drawRect:dirtyRect];

}

@end

它只对我有用,因为我明确地处理行更改他们的选择和 AFAIK 我不依赖 OS 为我更改它的任何地方。如果我能再做一次,我会推动使用系统突出显示颜色,在这种情况下我可以免费获得此功能。

作为对您的回答的一个小小的贡献。这也适用于 drawSelectionInRect 实现产生的奇怪对比。这是一个 Swift 解决方案,也可以在 NSTableCellView:

中实现
    override var backgroundStyle: NSBackgroundStyle {
             get {
                 return self.backgroundStyle
            }

             set {

            }         
        }