2012-07-22 19 views
9

Estoy usando una vista de tabla basada en vista y no quiero que dibuje NSTextFields con color de texto blanco cuando se selecciona. No pude encontrar una solución funcional. Entonces cualquier ayuda es muy apreciada.Cómo deshabilitar el color de texto blanco en la selección en NSTableView basado en vista?

Aquí está mi problema:

enter image description here

Quiero que la "selección es blanco" texto también se dibuja en el color de texto predeterminado.

Hasta ahora he dado cuenta de que

  • atributos de ajuste en tableView:viewForTableColumn:item: realmente no ayuda
  • Configuración NSTextField color a un color personalizado, que es algo diferente que el color predeterminado de control, impedirá que se retraiga blanco, pero aún pierde el estilo de fuente (negrita, cursiva, etc.).
  • Configuración NSTableViewselectionHighlightStyle Atributo a NSTableViewSelectionHighlightStyleNone hace el truco pero no volverá a dibujar NSTableRowView. Además, el estilo de selección no es lo que quiero. Quiero el primer clic para seleccionar la fila y el segundo clic para editar el campo de texto. Cuando usa NSTableViewSelectionHighlightStyleNone su primer clic comienza a editar el campo de texto.
  • El color del texto no cambia si el borde NSTextField está delimitado. Pero no quiero campos de texto delimitados (como se muestra en la captura de pantalla. Los campos de texto son editables)

No pude averiguar "cómo" el campo de texto obtiene el color blanco. He reemplazado setTextColor: y me di cuenta de que nunca se llama cuando se cambia la selección. Así que supongo que un NSAttributedString está construido en algún lugar dentro de la rutina de dibujo/selección de NSTable.

Cualquier ayuda es muy apreciada.

Respuesta

12

Encontré la respuesta. Tuve que crear la subclase NSTableCellView y anular setBackgroundStyle:. ¡Eso es todo!

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

Oh. Gracias. Yo solo "desactivé" a setter. Para swift es: 'anular var backgroundStyle: NSBackgroundStyle {get {return .Dark} establecer {}}' – surfrider

-1

Establezco el color de la celda en mi vista de tabla delegado'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>]; 
     ... 
     } 
    ... 
} 

Esto no afecta el tamaño de fuente ni el estilo.

+3

tablas basadas en vistas están trabajando diferente. – cocoafan

+0

¿Cómo están trabajando de manera diferente? Si está utilizando 'NSTableView' o una subclase, si su objeto controlador adopta el protocolo' NSTableViewDelegate' recibe el selector de mensajes anterior. Utilizo exactamente esta técnica para seleccionar selectivamente las entradas en una tabla cuando no son aplicables en un contexto dado. Simplemente llamo a '[tableViewId setDelegate: self]' en el método y bingo de mi controlador 'awakeFromNib:'. –

+1

las tablas basadas en celdas y las tablas basadas en vista funcionan de manera diferente. Está utilizando una tabla basada en celdas '-tableView: willDisplayCell: forTableColumn: row:' nunca se invocará si estuviera usando tablas basadas en vistas. Oye, gracias por intentar ayudar. – cocoafan

0

En lugar de primordial NSTableCellView 's backgroundStyle, me pareció más conveniente para anular viewWillDraw()NSTableRowView en su lugar. Este es en realidad el método que cambia de forma predeterminada el estilo de fondo de su vista de celda durante la selección.

Se podría desactivar este comportamiento:

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. 
    } 
} 
Cuestiones relacionadas