我有一个基于NSTableView的视图,带有自定义的NSTableCellView。此自定义NSTableCellView具有多个标签(NSTextField)。 NSTableCellView的整个UI都是在IB中构建的。
NSTableCellView可以处于正常状态并处于选定状态。在正常状态下,所有文本标签都应为黑色,在选定状态下,它们应为白色。
我该如何管理?
答案 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
}
}