NSTextField在NSTableCellView中

时间:2012-02-05 12:13:43

标签: macos cocoa nstableview nstextfield

我有一个基于NSTableView的视图,带有自定义的NSTableCellView。此自定义NSTableCellView具有多个标签(NSTextField)。 NSTableCellView的整个UI都是在IB中构建的。

NSTableCellView可以处于正常状态并处于选定状态。在正常状态下,所有文本标签都应为黑色,在选定状态下,它们应为白色。

我该如何管理?

4 个答案:

答案 0 :(得分:14)

在NSTableCellView上覆盖setBackgroundStyle:以了解背景何时发生变化,这会影响您在单元格中应使用的文本颜色。

例如:

- (void)setBackgroundStyle:(NSBackgroundStyle)style
{
    [super setBackgroundStyle:style];

    // If the cell's text color is black, this sets it to white
    [((NSCell *)self.descriptionField.cell) setBackgroundStyle:style];

    // Otherwise you need to change the color manually
    switch (style) {
        case NSBackgroundStyleLight:
            [self.descriptionField setTextColor:[NSColor colorWithCalibratedWhite:0.4 alpha:1.0]];
            break;

        case NSBackgroundStyleDark:
        default:
            [self.descriptionField setTextColor:[NSColor colorWithCalibratedWhite:1.0 alpha:1.0]];
            break;
    }
}

在源列表表视图中,单元格视图的背景样式设置为Light,其textField的backgroundStyle也是如此,但textField也在其文本下绘制阴影,但尚未确切地找到控制它的内容/确定它应该是什么发生。

答案 1 :(得分:0)

实现这一目标的最简单方法可能是继承NSTextField并覆盖子类中的drawRect:方法。在那里,您可以确定当前是否使用此代码选择了包含NSTextField实例的NSTableCellView实例(我使用的是NSOutlineView,但它也适用于NSTableView):

BOOL selected = NO;
id tableView = [[[self superview] superview] superview];
if ([tableView isKindOfClass:[NSTableView class]]) {
    NSInteger row = [tableView selectedRow];
    if (row != -1) {
        id cellView = [tableView viewAtColumn:0 row:row makeIfNecessary:YES];
        if ([cellView isEqualTo:[self superview]]) selected = YES;
    }
}

然后绘制这样的视图:

if (selected) {
    // set your color here
    // draw [self stringValue] here in [self bounds]
} else {
    // call [super drawRect]
}

答案 2 :(得分:0)

无论表格视图的样式如何,这都有效:

- (void)setBackgroundStyle:(NSBackgroundStyle)backgroundStyle {
    [super setBackgroundStyle:backgroundStyle];
    NSTableView *tableView = self.enclosingScrollView.documentView;
    BOOL tableViewIsFirstResponder = [tableView isEqual:[self.window firstResponder]];
    NSColor *color = nil;
    if(backgroundStyle == NSBackgroundStyleLight) {
        color = tableViewIsFirstResponder ? [NSColor lightGrayColor] : [NSColor darkGrayColor];
    } else {
        color = [NSColor whiteColor];
    }
    myTextField.textColor = color;
}

答案 3 :(得分:0)

快捷键4

 override var backgroundStyle: NSView.BackgroundStyle {
     get {
        return super.backgroundStyle
     }
     set {
        self.yourCustomLabel.textColor = NSColor(calibratedWhite: 0.0, alpha: 1.0)//black
     }
 }