2012-10-20 7 views
14

Ho un numero personalizzato NSTableCellView con 3 campi di testo, 1 che è arrivato e altri 2 che ho creato io stesso. Ecco il problema:
enter image description hereEtichette NSTableCellView personalizzate che non cambiano il colore del testo quando selezionato

Il colore del testo dei campi di testo rimane lo stesso anche quando faccio clic sulla riga. Ho provato a implementare un codice che ho trovato su google, ma non funziona. Il mio codice personalizzato 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]; 
} 

Cosa posso fare per rendere il colore del testo delle etichette sia in bianco quando l'utente fa clic su di essi?

+0

dove è textfield sopra la loro, tutti sono etichette giusto? – vishy

+0

sì, è vero. cambiata la domanda per evitare equivoci –

+0

basta ottenere la cella in 'didSelect' usando' cellForRow' e impostare i colori delle etichette nella cella .. – vishy

risposta

17

In realtà, l'override di setBackgroundStyle su NSTableViewCell ha funzionato perfettamente per me, almeno su OS X 10.8. Viene aggiornato sugli eventi di selezione e sull'attivazione/disattivazione della finestra.

Ecco il mio impl cellulari personalizzati - così banale come si può ottenere:

@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

Perché chiami 'super: setBackgroundStyle'? –

+3

@DantheMan: Innanzitutto, perché è la cosa giusta da fare (vale a dire l'impostazione predefinita), a meno che tu non abbia una ragione per non farlo. In secondo luogo, imposta il colore del testo del campo di testo predefinito e probabilmente imposta anche il colore di sfondo. –

+0

Questo non funziona in Swift 1.2 per questo: http://stackoverflow.com/questions/28718577/issue-with-conforming-to-objective-c-protocol-from-swift-nsobject-subclass –

-5

Nella vostra tableViewSelectionDidChange ottenere la cella utilizzando

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

Questo funziona per voi.

È possibile che si verifichi un problema quando si seleziona un'altra cella dopo questo, in quel momento la cella precedente potrebbe avere etichette ancora bianche. Se ciò causa problemi hai solo un'istanza NSIndexPath nella tua classe di intestazione che rappresenta il precedente IndexPath selezionato, usando questo puoi tornare ai colori predefiniti dopo aver selezionato una nuova cella.

+0

btw, cambia 'didSelectRowForIndexPath' a' tableViewSelectionDidChange'. non c'è 'didSelectRowForIndexPath' per NSTableView. –

+0

ok, grazie .. non ho ancora iniziato a sviluppare app Mac così .. – vishy

+2

Divertente come una risposta con codice UIKit è stata contrassegnata come corretta anche se la domanda riguardava OS X/AppKit ... –

9

Ampliando la risposta accettata, in Swift 2.0 il processo è leggermente diverso. Sovrascrivere la proprietà backgroundStyle del NSTableCellView sottoclasse di aggiungere un didSet property observer: (? Non è questo divertente)

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

serbatoi così mutevole! – Mike97

0

E per 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 
     } 
    } 
}