2015-04-24 16 views
5

Ho un NSTableView in cui sto cambiando il colore del testo in una particolare colonna, ma quando una riga è selezionata, il testo non cambia in un colore più appropriato che è leggibile.Come invertire il colore del testo della riga NSTableView selezionata

Le colonne Data modifica, Dimensioni e Tipo di Finder hanno testo grigio e quando si seleziona una riga file/cartella, il testo in grigio diventa bianco (in modo che sia leggibile all'interno dell'evidenziazione blu).

Non riesco a trovare una casella di controllo magica su XCode per abilitare questo comportamento di default, quindi qualcuno sa come potrei ottenere lo stesso effetto?

Sto utilizzando Swift in XCode 6.3.

Grazie.

risposta

14

Non si dice quale vista o vista la gerarchia si sta utilizzando per le celle. Inoltre, non dici come o dove stai impostando il colore dei campi di testo o di quale colore, in particolare.

Quando si seleziona una riga, la riga calcola automaticamente il valore interiorBackgroundStyle. Imposta anche il backgroundStyle della visualizzazione cella se risponde a -setBackgroundStyle: o è un NSControl con una cella che risponde a tale.

Se la vista cella è un'istanza di NSTableCellView, inoltra lo stile di sfondo a tutte le sue sottoview che soddisfano gli stessi criteri. Se si utilizza una vista contenitore diversa come visualizzazione cella e si desidera inoltrare lo stile di sfondo in questo modo, è necessario implementarlo nella classe di visualizzazione.

La cella di NSTextField (NSTextFieldCell) risponde a -setBackgroundStyle: e pertanto il suo stile di sfondo viene impostato automaticamente dai meccanismi di cui sopra. La cella del campo di testo cambierà automaticamente il colore del suo testo in bianco se il suo textColor è uno dei colori di controllo standard (ad esempio NSColor.controlTextColor()), ma non lo farà se assegni un colore non standard. Quindi, se stai impostando un colore specifico per il tuo testo, sei responsabile di cambiarlo quando cambia lo stile di sfondo.

È possibile utilizzare una sottoclasse di NSTableCellView e aggiungere un osservatore di proprietà (didSet) per la proprietà backgroundStyle. Questo può cambiare il campo di testo textColor a seconda dello stile che è stato impostato. Ad esempio, è possibile utilizzare il colore personalizzato se lo stile di sfondo non è .Dark o utilizzare il normale colore del campo di testo NSColor.controlTextColor() se è .Dark (in modo che il campo di testo lo visualizzi effettivamente come bianco).

Si potrebbe anche utilizzare una sottoclasse di NSTextFieldCell per il campo di testo e fare lo stesso genere di cose. Oppure eseguire l'override di drawInteriorWithFrame(_:inView:) per disegnare con un colore di testo diverso a seconda dello stile di sfondo.

+0

Nella tabellaView: viewForTableColumn: row: metodo delegate Lo sto facendo per impostare il colore del campo di testo nella mia cella basata sulla vista: cell.textField! .textColor = NSColor.redColor(). Le celle impostate su blackColor() invertono semplicemente bene, ma redColor() no. La tua risposta richiederà un po 'di tempo per capire, quindi grazie per avermi dato alcune idee da esaminare. –

+0

Amico, controllerò, ma se funziona, tu sei il mio salvatore !! AppKit è così strano quando viene da UIKit :) – Frizlab

+0

Funziona! \ o/Fantastico. – Frizlab

4

Con l'aiuto della risposta di Ken (sopra) sono riuscito a farlo funzionare. Ecco un progetto di massima che fa quello che voglio a:

import Cocoa 

class CustomTextFieldCell: NSTextFieldCell { 

    // When the background changes (as a result of selection/deselection) switch appropriate colours 
    override var backgroundStyle: NSBackgroundStyle { 
     didSet { 
      if (backgroundStyle == NSBackgroundStyle.Dark) { 
       if self.textColor == NSColor.redColor() { 
        self.textColor = NSColor.yellowColor() 
       } 
      } else if (backgroundStyle == NSBackgroundStyle.Light) { 
       if (self.textColor == NSColor.yellowColor()) { 
        self.textColor = NSColor.redColor() 
       } 
      } 
     } 
    } 

    // When the colour changes, switch to a better alternative for the cell's current background 
    override var textColor: NSColor? { 
     didSet { 
      if let colour = self.textColor { 
       if backgroundStyle == NSBackgroundStyle.Dark { 
        if self.textColor == NSColor.redColor() { 
         self.textColor = NSColor.yellowColor() 
        } 
       } else if backgroundStyle == NSBackgroundStyle.Light { 
        if (self.textColor == NSColor.yellowColor()) { 
         self.textColor = NSColor.redColor() 
        } 
       } 
      } 
     } 
    } 

} 

Se ho impostato la mia CustomTextFieldCell come la classe personalizzata per la mia tabella di vista di cella nella finestra di ispezione identità, funziona. Avevo bisogno di aggiungere un osservatore delle proprietà per textColor, in modo che le righe attualmente evidenziate abbiano lo stesso trattamento. Posso modificarlo ora in modo che non sia codificato in modo rigido, ma questo dimostra il concetto.

Grazie Ken.

Problemi correlati