17

I have a custom NSTableCellView with 3 textfields, 1 that came along and 2 others that i created myself. Here's the problem:
enter image description here

The textfields' text color stays the same even when i click on the row. I've tried to implement a code i found out by googling but it doesn't work. My Custom NSTableCellView code is:

- (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];
}

What can i do to make the labels' text color white when the user clicks on them?

Pedro Vieira
  • 3,330
  • 3
  • 41
  • 76

4 Answers4

19

Actually, overriding setBackgroundStyle on NSTableViewCell has worked perfectly for me, at least on OS X 10.8. It is updated on selection events and on window activation/deactivation.

Here's my custom cell impl — as trivial as it can get:

@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
Andrey Tarantsov
  • 8,965
  • 7
  • 54
  • 58
  • Why do you call `super:setBackgroundStyle` ? – Daniel Node.js Jul 22 '14 at 20:47
  • 3
    @DantheMan: First, because it's the right (i.e. the default) thing to do unless you have a reason not to. Second, it sets the text color of the default text field, and probably sets the background color as well. – Andrey Tarantsov Jul 23 '14 at 08:25
  • This doesn't work in Swift 1.2 because of this: http://stackoverflow.com/questions/28718577/issue-with-conforming-to-objective-c-protocol-from-swift-nsobject-subclass – Sean Moubry Apr 09 '15 at 15:44
  • 1
    @SeanMoubry Can't test with Swift 1.2, but in current Swift 2.2 it works: `override var backgroundStyle: NSBackgroundStyle { get { return super.backgroundStyle } set { super.backgroundStyle = newValue } }` – Lars Blumberg May 11 '16 at 15:29
  • 1
    @LarsBlumberg As another answer states, the correct thing to do in cases like this is to use `didSet`. – Andrey Tarantsov May 13 '16 at 16:35
  • I agree, `didSet` is more straight forward. Using `set` and `get` is however not incorrect, it can also be considered _correct_. – Lars Blumberg May 14 '16 at 08:12
13

Expanding on the accepted answer, in Swift 2.0 the process is slightly different. Override the backgroundStyle property of your NSTableCellView subclass to add a didSet property observer:

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()
            }
        }
    }

}
Andrew
  • 7,630
  • 3
  • 42
  • 51
5

And for Swift 3 & 4 (isn’t this fun?):

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
        }
    }
}
John Scalo
  • 3,194
  • 1
  • 27
  • 35
-5

In your tableViewSelectionDidChange get the cell using

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];

This will work for you.

You may get problem when you select other cell again after this, at that time previous cell may have still white colored labels. If this causes problems to you just have a NSIndexPath instance in your header class which represents previous selected indexPath, using this you can set back to default colors after selecting a new cell.

vishy
  • 3,241
  • 1
  • 20
  • 25