NSTextField в NSTableCellView - PullRequest
       22

NSTextField в NSTableCellView

5 голосов
/ 05 февраля 2012

У меня есть представление на основе NSTableView с пользовательским NSTableCellView. Этот пользовательский NSTableCellView имеет несколько меток (NSTextField). Весь интерфейс NSTableCellView встроен в IB.

NSTableCellView может находиться в нормальном состоянии и в выбранном состоянии. В нормальном состоянии все текстовые метки должны быть черными, в выбранном состоянии они должны быть белыми.

Как мне это сделать?

Ответы [ 4 ]

14 голосов
/ 07 марта 2012

Переопределить setBackgroundStyle: на NSTableCellView, чтобы знать, когда меняется фон, что влияет на то, какой цвет текста вы должны использовать в своей ячейке.

Например:

- (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, как и backgroundStyle его textField, однако textField также рисует тень под своим текстом и еще не нашел, что именно контролирует это / определяет, должно ли оно случается.

0 голосов
/ 06 февраля 2019

Swift 4

 override var backgroundStyle: NSView.BackgroundStyle {
     get {
        return super.backgroundStyle
     }
     set {
        self.yourCustomLabel.textColor = NSColor(calibratedWhite: 0.0, alpha: 1.0)//black
     }
 }
0 голосов
/ 15 августа 2013

Это работает независимо от стиля представления таблицы:

- (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;
}
0 голосов
/ 11 февраля 2012

Вероятно, самый простой способ сделать это - создать подкласс NSTextField и переопределить метод drawRect: в вашем подклассе. Там вы можете определить, выбран ли в данный момент экземпляр NSTableCellView, содержащий ваши экземпляры NSTextField, с помощью этого кода (который я использую с 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]
}
...