2012-10-20 8 views
14

Mam niestandardowy NSTableCellView z 3 polami tekstowymi, 1, który pojawił się i 2 innymi, które sam utworzyłem. Oto problem: kolor tekstu
enter image description hereNiestandardowe etykiety NSTableCellView niezmieniające koloru tekstu po wybraniu

The pól tekstowych pozostaje taka sama nawet po kliknięciu na wiersz. Próbowałem zaimplementować kod znaleziony przez google, ale nie działa. Mój kod klienta NSTableCellView jest:

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

Co mogę zrobić, aby kolor tekstu na etykietach biały, gdy użytkownik kliknie na nich?

+0

gdzie jest textfield nad ich, wszystkie są etykiety w prawo? – vishy

+0

tak, to prawda. zmienił pytanie, aby uniknąć nieporozumień. –

+0

po prostu pobierz komórkę w 'didSelect' używając' cellForRow' i ustaw kolory etykiet w komórce .. – vishy

Odpowiedz

17

W rzeczywistości nadpisanie setBackgroundStyle na NSTableViewCell działa doskonale dla mnie, przynajmniej na OS X 10.8. Jest aktualizowany w przypadku zdarzeń wyboru i aktywacji/dezaktywacji okna.

Oto moje impl zwyczaj komórkowe - jako trywialne, ponieważ może dostać:

@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

Dlaczego nazywacie 'super: setBackgroundStyle'? –

+3

@DantheMan: Po pierwsze, ponieważ jest to właściwa (to znaczy domyślna) rzecz, o ile nie masz powodu, aby tego nie robić. Po drugie, ustawia kolor tekstu domyślnego pola tekstowego i prawdopodobnie również ustawia kolor tła. –

+0

To nie działa w Swift 1.2 z tego powodu: http://stackoverflow.com/questions/28718577/wprowadzić-zgodniez-zobyciem-c-protocol-z-swift-nsobject-subclass –

-5

w twojej tableViewSelectionDidChange dostać komórkę używając

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

To będzie pracować dla Ciebie.

Może pojawić się problem, gdy ponownie wybierzesz inną komórkę po tym czasie, w tym czasie poprzednia komórka może nadal mieć białe etykiety. Jeśli powoduje to problemy, po prostu masz instancję NSIndexPath w klasie nagłówka, która reprezentuje poprzednią wybraną ścieżkę indexPath, dzięki czemu możesz przywrócić domyślne kolory po wybraniu nowej komórki.

+0

btw, zmień 'didSelectRowForIndexPath' na' tableViewSelectionDidChange'. nie ma 'didSelectRowForIndexPath' dla NSTableView. –

+0

ok, dziękuję ... nie zacząłem tworzyć aplikacji dla komputerów Mac, więc ... – vishy

+2

Zabawne, jak odpowiedź z kodem UIKit została oznaczona jako poprawna, chociaż pytanie dotyczyło OS X/AppKit ... –

9

Rozwijając przyjętą odpowiedzi w Swift 2.0 procesu jest nieco inna. Przestawianie własność swojej NSTableCellView podklasy backgroundStyle dodać didSet property observer: (? Nie jest to zabawa)

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

} 
+0

czołgi tak mutch! – Mike97

0

a dla 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 
     } 
    } 
} 
Powiązane problemy