Как определить, когда NSTextFieldCell isHighlighted не имеет фокуса? - PullRequest
8 голосов
/ 29 июля 2011

Я вложил в класс NSTextFieldCell (внутри NSTableView), чтобы нарисовать собственный цвет переднего плана, когда выбрана ячейка (т. Е. Строка) (например, isHighlighted - true), и все работает нормально.

Проблема заключается в том, когдатабличное представление теряет фокус. Я хочу нарисовать выбранные строки другим цветом, как я могу определить, является ли табличное представление, содержащее ячейку, первым респондентом внутри drawWithFrame: (NSRect) cellFrame inView: (NSView *) controlView?

Мой текущий код

- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView*)controlView {
        NSColor* textColor = [self isHighlighted]
                 ? [NSColor alternateSelectedControlTextColor]
                 : [NSColor darkGrayColor];
}

Ответы [ 3 ]

6 голосов
/ 04 октября 2013

Лучший способ, который я нашел, который не заставляет вас иметь дело с респондентами (поскольку иногда супервизой controlView является респондент или чепуха), это использовать редактор:

BOOL isEditing = [(NSTextField *)[self controlView] currentEditor] != nil;

Легко как то!

4 голосов
/ 02 сентября 2011

Я нашел решение, которое использует firstResponder, оно простое и кажется эффективным

- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView*)controlView {
        NSColor* textColor;

        if ([self isHighlighted]) {
            textColor = [[controlView window] firstResponder] == controlView 
                     ? [NSColor alternateSelectedControlTextColor]
                     : [NSColor yellowColor];
        } else {
            textColor = [NSColor darkGrayColor];
        }

        // use textColor
        ...
        ...
        [super drawWithFrame:cellFrame inView:controlView];
    }
2 голосов
/ 06 августа 2014

еще одна вещь, приведенный выше код идеально подходит, однако, если у вас есть несколько окон вам нужно проверить, является ли ваше окно ключом

        if (controlView && ([[controlView window] firstResponder] == controlView) && [[controlView window] isKeyWindow]) {
            [attributes setObject:[NSColor whiteColor] forKey:NSForegroundColorAttributeName];
        }
...