Пользовательские метки NSTableCellView, не меняющие цвет текста при выборе

У меня есть пользовательский NSTableCellView с 3 текстовыми полями, 1 который появился и 2 других, которые я создал сам. Вот в чем проблема:
введите здесь описание изображения

Цвет текста текстовых полей остается прежним, даже когда я нажимаю на строку. Я попытался реализовать код, который я нашел, погуглив, но он не работает. Мой пользовательский код NSTableCellView:

- (void)drawRect:(NSRect)dirtyRect{
    NSColor *color = [NSColor colorWithCalibratedRed:(26/255.0) green:(26/255.0) blue:(26/255.0) alpha:1.0];
    [self.textField setTextColor:color];

    color = [NSColor colorWithCalibratedRed:(102/255.0) green:(102/255.0) blue:(102/255.0) alpha:1.0];
    [_lbl1 setTextColor:color];
    [_lbl2 setTextColor:color];
}

- (void)setBackgroundStyle:(NSBackgroundStyle)backgroundStyle {
    NSColor *color = (backgroundStyle == NSBackgroundStyleDark) ? [NSColor windowBackgroundColor] : [NSColor controlShadowColor];
    self.textField.textColor = color;
    self.lbl1.textColor = color;
    self.lbl2.textColor = color;
    [super setBackgroundStyle:backgroundStyle];
}

Что я могу сделать, чтобы цвет текста меток был белым, когда пользователь нажимает на них?


person Pedro Vieira    schedule 20.10.2012    source источник
comment
где текстовое поле над ними, все метки не так ли?   -  person vishy    schedule 20.10.2012
comment
да это правильно. изменил вопрос, чтобы избежать недоразумений   -  person Pedro Vieira    schedule 20.10.2012
comment
просто получите ячейку в didSelect, используя cellForRow, и установите цвета меток в ячейке..   -  person vishy    schedule 20.10.2012
comment
создайте ответ на этот вопрос с некоторым примером кода, и я приму его   -  person Pedro Vieira    schedule 20.10.2012
comment
я ответил ниже проверьте ..   -  person vishy    schedule 20.10.2012
comment
Вам следует использовать цвета [NSColor textColor] и [NSColor selectedTextColor]. Ваши цвета могут быть непригодны для моего выбранного цвета.   -  person Mark Lilback    schedule 06.03.2015


Ответы (4)


На самом деле, переопределение setBackgroundStyle в NSTableViewCell отлично сработало для меня, по крайней мере, в OS X 10.8. Он обновляется при событиях выбора и при активации/деактивации окна.

Вот моя собственная реализация ячейки — настолько тривиальная, насколько это возможно:

@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
person Andrey Tarantsov    schedule 20.05.2013
comment
Почему вы звоните super:setBackgroundStyle ? - person Daniel says Reinstate Monica; 23.07.2014
comment
@DantheMan: Во-первых, потому что это правильно (то есть по умолчанию), если у вас нет причин не делать этого. Во-вторых, он устанавливает цвет текста текстового поля по умолчанию и, возможно, также устанавливает цвет фона. - person Andrey Tarantsov; 23.07.2014
comment
Это не работает в Swift 1.2 по этой причине: stackoverflow.com/questions/28718577/ - person Sean Moubry; 09.04.2015
comment
@SeanMoubry Не могу протестировать Swift 1.2, но в текущей версии Swift 2.2 это работает: override var backgroundStyle: NSBackgroundStyle { get { return super.backgroundStyle } set { super.backgroundStyle = newValue } } - person Lars Blumberg; 11.05.2016
comment
@LarsBlumberg Как говорится в другом ответе, в подобных случаях правильно использовать didSet. - person Andrey Tarantsov; 13.05.2016
comment
Я согласен, didSet более прямолинеен. Однако использование set и get не является неправильным, его также можно считать правильным. - person Lars Blumberg; 14.05.2016

Расширяя принятый ответ, в Swift 2.0 процесс немного отличается. Переопределите свойство backgroundStyle вашего подкласса NSTableCellView, чтобы добавить didSet наблюдатель за свойствами:

class CustomTableCellView: NSTableCellView {

    @IBOutlet weak var detailTextField: NSTextField!

    override var backgroundStyle: NSBackgroundStyle {
        didSet {
            if self.backgroundStyle == .Light {
                self.detailTextField.textColor = NSColor.controlTextColor()
            } else if self.backgroundStyle == .Dark {
                self.detailTextField.textColor = NSColor.alternateSelectedControlTextColor()
            }
        }
    }

}
person Andrew    schedule 08.10.2015
comment
столько танков! - person Mike97; 20.09.2017

И для Swift 3 и 4 (разве это не весело?):

override var backgroundStyle: NSView.BackgroundStyle {
    didSet {
        if self.backgroundStyle == .light {
            self.detailTextField.textColor = NSColor.controlTextColor
        } else if self.backgroundStyle == .dark {
            self.detailTextField.textColor = NSColor.alternateSelectedControlTextColor
        }
    }
}
person John Scalo    schedule 08.03.2018

В вашем tableViewSelectionDidChange получите ячейку, используя

UITableViewCell* cell = [tableView cellForRowAtIndexPath:indexPath]; //replace UITableViewCell with your customCell class name if it other
//now as u got the instance of your cell u can modify the labels in it, like
cell.lable1.textColor = [UIColor whiteColor];

Это сработает для вас.

У вас могут возникнуть проблемы, когда после этого вы снова выберете другую ячейку, в то время предыдущая ячейка может иметь все еще белые метки. Если это вызывает проблемы, у вас просто есть экземпляр NSIndexPath в вашем классе заголовков, который представляет предыдущий выбранный indexPath, используя это, вы можете вернуться к цветам по умолчанию после выбора новой ячейки.

person vishy    schedule 20.10.2012
comment
Кстати, измените didSelectRowForIndexPath на tableViewSelectionDidChange. нет didSelectRowForIndexPath для NSTableView. - person Pedro Vieira; 20.10.2012
comment
Забавно, как ответ с кодом UIKit был помечен как правильный, хотя вопрос был об OS X/AppKit... - person Christian Kienle; 27.08.2013