2012-06-29 14 views
17

Para el cacao, tengo un NSTableView configurado para ser basado en la vista. Cuando se selecciona una fila, los campos de texto cambian su color a blanco. ¿Cómo lo mantengo negro?¿Cómo cambiar el color del texto NSTextField en la selección de fila?

También debería tener en cuenta que el resaltado está configurado en la Lista de origen (hace lo mismo en Regular). Highlight Setting

fila no seleccionados Unselected

fila seleccionada Selected Row

Me esperaba algo similar a la configuración de estado para iOS:

enter image description here

Esto fue sugerido en la WWDC 2011 Sesión 120 pero está un poco demorado, así que no voy a usarlo. Sin embargo, puede funcionar para otra persona.

- (void)tableViewSelectionDidChange:(NSNotification *)notification 
{ 
    [tableView enumerateAvailableRowViewsUsingBlock:^(NSTableRowView *rowView, NSInteger row){ 
     NSTableCellView *cellView = [rowView viewAtColumn:0]; 
     if(rowView.selected){ 
      cellView.textField.font = [NSFont boldSystemFontOfSize:14]; 
     }else{ 
      cellView.textField.font = [NSFont systemFontOfSize:14]; 
     } 
    }]; 
} 
+0

¿Esto ayuda? http://stackoverflow.com/questions/7949015/handling-custom-selection-style-in-view-based-nstableview – Augie

+0

Gracias. A menos que me haya perdido algo, parece más como colores de fondo. Ya lo hice para mi color de fondo personalizado. Estoy buscando el color del texto. – joels

+0

¿Los colores del campo de texto cambian hacia atrás cuando la fila no está seleccionada? Estoy tratando de entender cómo y por qué está sucediendo esto. – paulmelnikow

Respuesta

14

Dependiendo de por qué necesita hacer esto, hay 2 enfoques.

Puede subclase NSTableRowView y anular -[NSTableRowView interiorBackgroundStyle] para devolver NSBackgroundStyleLight. Esto les indicará a las celdas que se encuentran en un fondo claro y dibujarán un texto oscuro, que será negro.

La otra forma es crear la subclase NSTableCellView e ignorar -[NSTableCellView setBackgroundStyle:] y establecer los colores usted mismo allí.

11

Anule NSTableCellView y agregue este método para cambiar el color del texto cuando se selecciona la celda.

- (void) setBackgroundStyle:(NSBackgroundStyle)backgroundStyle 
{ 
    NSTableRowView *row = (NSTableRowView*)self.superview; 
    if (row.isSelected) { 
     self.textField.textColor = [NSColor blackColor]; 
    } else { 
     self.textField.textColor = [NSColor whiteColor]; 
    } 

} 
+2

Esto no dibuja correctamente cuando hay una selección pero la ventana no es la clave. Cocoa (a partir de 10.10) dibujará un fondo gris, pero el campo de texto es negro, por lo que los controles personalizados deben dibujarse como "inactivos". La comparación de backgroundStyle! = NSBackgroundStyleLight para determinar si los controles deben dibujarse como activos parece ser la clave. – kainjow

10

No hay necesidad de código personalizado para lograr eso.

Simplemente configure el color de la etiqueta como "color de etiqueta" en el Interface Builder. La función automática de blanco/negro solo funciona si la etiqueta tiene el "Color de texto de control" configurado y está en un NSTableCellView.

0

Basado en la respuesta de @ sabes, creé esta subclase NSTextFieldCell que puede usar para establecer los colores de texto personalizados cuando se selecciona o anula una fila. Puede establecer la subclase de la celda de campo de texto relevante en IB.

@interface SNBlueTextFieldCell : NSTextFieldCell 

@end 

@implementation SNBlueTextFieldCell 

- (void)setBackgroundStyle:(NSBackgroundStyle)backgroundStyle { 
    [self setTextColor:(backgroundStyle==NSBackgroundStyleDark ? [NSColor blackColor] : [NSColor blueColor])]; 
} 

@end 
1

Se me ocurrió una solución diferente. La creación de subclases de NSTableCellView hubiera estado bien si Cocoa hubiera admitido @IBOutletCollection. Porque entonces podría tener una subclase Cell que tenga una matriz de todos los NSTextFields en la celda. Pero como tenía muchos tipos de células con números variables de NSTextFields, no me gustó esta opción. En cambio, eché un vistazo a la documentación de Apple para la propiedad backgroundStyle en NSTableCellView.

La implementación predeterminada reenvía automáticamente las llamadas a todas las subvistas que implementan setBackgroundStyle: o son NSControl, que tienen clases NSCell que responden a backgroundStyle.

Si mis TextFields implementan setBackgroundStyle, deberían recibir una notificación cuando cambie la selección de celda. Sin embargo, este reenvío del estilo de fondo no es recursivo.Como mis NSTextFields estaban dentro de NSStackViews, no recibían el mensaje. Para evitar esto, acabo de escribir una extensión para implementar setBackgroundStyle en todos los NSViews. Simplemente reenvía el mensaje. Por último, agregué una extensión a NSTextField para implementar también este método. Desde esta extensión, cambio el color del texto y llamo a super. Esta solución también es agradable porque no se necesitan subclases. No hay subclases de NSTableCellView ni de NSTextField.

Agregar esta funcionalidad a todas las vistas y a todos los NSTextFields podría causar problemas con NSTextFields que no están dentro de NSTableViews cambiando de color inesperadamente. Pero hasta ahora, solo los que están dentro de mi TableViews/OutlineViews están cambiando de color y eso es exactamente lo que estaba buscando. Si ve campos de texto que cambian de color que no espera, puede crear una subclase de NSTextField e implementar una anulación de setBackgroundStyle solo en esa subclase en lugar de agregarla a todos los NSTextFields.

El código en Swift 3 que utilicé se pega a continuación.

extension NSView { 
    func setBackgroundStyle(_ newValue: NSBackgroundStyle) { 
     for view in self.subviews { 
      view.setBackgroundStyle(newValue) 
     } 
    } 
} 

extension NSTextField { 
    override func setBackgroundStyle(_ newValue: NSBackgroundStyle) { 
     switch newValue { 
     case .dark: 
      self.textColor = NSColor.controlLightHighlightColor 
     case .light, .lowered, .raised: 
      self.textColor = NSColor.labelColor 
     } 
     super.setBackgroundStyle(newValue) 
    } 
} 
1

Para mi aplicación Swift ninguno de los anteriores parecía funcionar bastante bien. Este método maneja el NSTableView perdiendo el foco correctamente y cuando la ventana no es la ventana clave pero la celda todavía está seleccionada.

Dentro de la subclase NSTableCellView utilizar lo siguiente:

override var backgroundStyle: NSView.BackgroundStyle { 
    willSet { 
    if newValue == .dark { 
     title.textColor = NSColor.white 
    } else { 
     title.textColor = NSColor.labelColor 
    } 
    } 
} 
Cuestiones relacionadas