Персонализираните етикети 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. Актуализира се при събития за избор и при активиране/деактивиране на прозорец.

Ето моята персонализирана клетка 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
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