2012-07-22 8 views
9

Sto usando una vista tabella basata sulla vista e non voglio che disegni NSTextField con il colore del testo bianco quando è selezionato. Non sono riuscito a trovare una soluzione funzionante. Quindi qualsiasi aiuto è molto apprezzato.Come disattivare il colore del testo bianco nella selezione in NSTableView basato su visualizzazione?

Ecco il mio problema:

enter image description here

voglio che la "selezione è bianca" text anche essere disegnato nel colore del testo di default.

Finora ho capito che

  • Impostazione attributi in tableView:viewForTableColumn:item: non aiuta
  • Impostazione NSTextField colore a un colore personalizzato, che è qualcosa di diverso rispetto al colore predefinito di controllo, impedirà di disegno in bianco ma perde ancora lo stile del carattere (grassetto, corsivo, ecc.).
  • L'impostazione NSTableView di selectionHighlightStyle attribuisce a NSTableViewSelectionHighlightStyleNone il trucco ma non verrà ridisegnato NSTableRowView. Anche lo stile scelto non è quello che voglio. Voglio il primo clic per selezionare la riga e il secondo clic per modificare il campo di testo. Quando si utilizza NSTableViewSelectionHighlightStyleNone, il primo clic inizia a modificare il campo di testo.
  • Il colore del testo non cambia se il NSTextField è bordato. Ma non voglio campi di testo con bordi (come mostrato nello screenshot I campi di testo sono modificabili)

Non riuscivo a capire 'come' il campo di testo ottiene il colore bianco. Ho sostituito setTextColor: e mi sono reso conto che non viene mai chiamato quando la selezione viene modificata. Quindi immagino che NSAttributedString sia costruito da qualche parte all'interno della routine di disegno/selezione di NSTableView.

Qualsiasi aiuto è molto apprezzato.

risposta

12

Ho trovato la risposta. Dovevo sottoclasse lo NSTableCellView e sostituisco setBackgroundStyle:. È tutto!

- (void)setBackgroundStyle:(NSBackgroundStyle)backgroundStyle { 
    [super setBackgroundStyle: NSBackgroundStyleLight]; 
} 
+0

Oh. Grazie. Ho appena "settato" disabilitato. Per swift è: 'override var backgroundStyle: NSBackgroundStyle {get {return .Dark} set {}}' – surfrider

-1

Ho impostato il colore della cella nella vista tabella delegate's -tableView: willDisplayCell: forTableColumn: row: method.

-(void)tableView:(NSTableView *)tableView willDisplayCell:(id)cell 
    forTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row 
{ 
    if(tableView==<table view id of interest>) 
     { 
     ... 
     [cell setTextColor:<colour appropriate for this cell>]; 
     ... 
     } 
    ... 
} 

Questo non ha alcun effetto sulla dimensione del carattere o sullo stile.

+3

tabelle in base alla vista stanno lavorando diversi. – cocoafan

+0

Come funzionano diversamente? Se stai usando 'NSTableView' o una sottoclasse, se l'oggetto controller adotta il protocollo' NSTableViewDelegate' ottiene il selettore di messaggi sopra. Uso esattamente questa tecnica per selezionare in modo selettivo le voci in una tabella quando sono inapplicabili in un determinato contesto. Ho semplicemente chiamato '[tableViewId setDelegate: self]' nel mio controller 'awakeFromNib:' metodo e bingo. –

+1

Le tabelle basate su celle e le tabelle basate su viste funzionano in modo diverso. Si sta utilizzando una tabella basata su celle '-tableView: willDisplayCell: forTableColumn: row:' non verrà mai chiamato se si utilizzavano tabelle basate su viste. Ehi, grazie per aver provato ad aiutarti. – cocoafan

0

Invece di preminente NSTableCellView s' backgroundStyle, l'ho trovato più conveniente di ignorare viewWillDraw() in NSTableRowView invece. Questo è in realtà il metodo che per impostazione predefinita cambia lo stile di sfondo della vista cella durante la selezione.

Si potrebbe disattivare questo comportamento:

class TableViewDelegate: NSObject, NSTableViewDelegate { 
    func tableView(tableView: NSTableView, rowViewForRow row: Int) -> NSTableRowView? { 
     return TableRowView(frame: NSRect.zero) 
    } 
} 

class TableRowView : NSTableRowView { 
    private override func viewWillDraw() { 
     // By do nothing we prevent the super method to be called. It would otherwise change the selected cell view's backgroundStyle property. 
    } 
} 
Problemi correlati