Проблема отображения ячейки NSTableView - PullRequest
1 голос
/ 03 января 2012

Я использую NSTableView, основанный на представлении, и столкнулся с небольшой проблемой.

Я пытаюсь переключить цвет текста двух моих меток с черного на белый при выделении.

Для этого я написал следующий код:

- (void)tableViewSelectionDidChange:(NSNotification *)notification
{
    NSView * viewInQuestion = [table viewAtColumn:0 row:[table selectedRow] makeIfNecessary:YES];

    if ([viewInQuestion isNotEqualTo:lastViewSelected])
    {
        [(NSTextField*)lastViewSelected.subviews.lastObject setTextColor:NSColor.blackColor];
        [(NSTextField*)[lastViewSelected.subviews objectAtIndex:1] setTextColor:NSColor.grayColor];
    }

    [(NSTextField*)viewInQuestion.subviews.lastObject setTextColor:NSColor.whiteColor];
    [(NSTextField*)[viewInQuestion.subviews objectAtIndex:1] setTextColor:NSColor.whiteColor];

    lastViewSelected = viewInQuestion;
}

Это прекрасно работает;Я получаю такой результат:

Проблема в том, что иногда текст не выглядит белым, хотя NSLog сказал мне, что цвет NSTextField был NSCalibratedWhite (или как его там называют).

Цвет также переключается обратно на черный, когда textField не отображается (прокручивается от него и затем назад).Тем не менее, даже когда это происходит, цвет NSTextField по-прежнему записывается как белый.

Ответы [ 2 ]

1 голос
/ 20 мая 2013

Переопределение setBackgroundStyle в NSTableViewCell отлично работает для меня, по крайней мере, в OS X 10.8. (Учитывая количество уместных вопросов по SO, можно предположить, что раньше были некоторые проблемы.)

Стиль фона обновляется при событиях выбора и при активации / деактивации окна, как и следовало ожидать.

Вот мой пользовательский элемент impl - настолько простой, насколько это возможно:

@implementation RuntimeInstanceCellView

- (void)setBackgroundStyle:(NSBackgroundStyle)backgroundStyle {
    [super setBackgroundStyle:backgroundStyle];
    self.detailTextField.textColor = (backgroundStyle == NSBackgroundStyleLight ? [NSColor darkGrayColor] : [NSColor colorWithCalibratedWhite:0.85 alpha:1.0]);
//    self.detailTextField.textColor = (backgroundStyle == NSBackgroundStyleLight ? [NSColor blackColor] : [NSColor whiteColor]);
}

@end
0 голосов
/ 04 января 2012

Мой метод очень хакерский и, вероятно, не оптимальное решение;Но он разрешает это так, что это хорошо.

Предполагая, что вы реализовали tableSelectionDidChange так, как я, все, что вам нужно сделать, это зарегистрировать NSNotification и реализовать пользовательский метод, который должен быть более явным.часть вашего приложения init, awake или didFinishLaunching ...

NSView * contentView = table.enclosingScrollView.contentView;
[contentView setPostsFrameChangedNotifications:YES];
[NSNotificationCenter.defaultCenter addObserver:self selector:@selector(boundsDidChange:) name:NSViewBoundsDidChangeNotification object:contentView];

Где-то еще в программе ...

(при условии, что hasUpdatedCell - это свойство BOOLEAN)

- (void)boundsDidChange:(NSNotification *)notification
{
    /* Bounds can change while nothing is selected--> but we only want to execute the method if a cell is selected. */ 

    if ([table selectedRow] == -1) {return;}

    NSRect visibleRect = table.enclosingScrollView.visibleRect;
    NSView * viewInQuestion = [table viewAtColumn:0 row:[table selectedRow] makeIfNecessary:YES];
    NSPoint selectedViewOrigin = [viewInQuestion convertPoint:viewInQuestion.frame.origin toView:table.enclosingScrollView];

    /* If the selected cell is visible, then we can go ahead and redraw the white text as a part of the workaround.
       This is because scrolling away from the selected cell and back will make the cell revert back to black. */

    BOOL cellVisible = NSPointInRect(selectedViewOrigin, visibleRect);

    /* We already know we need to update it, and we will so we don't need to evaluate the next step in the program */

    if (!cellVisible && !hasUpdatedCell) {return;}


    if (cellVisible && !hasUpdatedCell)
    {
        /* The cell is visible but we haven't updated. Let's do it then. */

        [self tableViewSelectionDidChange:nil];
        hasUpdatedCell = YES;
    } 
    else if (!cellVisible)
    {
        /* The cell is not visible and we need to update next time. */

        hasUpdatedCell = NO;
    }
}

Вещи должны отображаться правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...