2011-07-29 14 views
7

He subclase un NSTextFieldCell (dentro de un NSTableView) para dibujar un color de primer plano personalizado cuando se selecciona una celda (es decir, una fila) (por ejemplo, isHighlighted es verdadero) y todo funciona bien.¿Cómo determinar cuándo NSTextFieldCell isHighlighted no tiene foco?

El problema es cuando la vista de tabla pierde el foco Quiero dibujar las filas seleccionadas con un color diferente, ¿cómo puedo determinar si la vista de tabla que contiene la celda no es la primera respuesta dentro drawWithFrame: (NSRect) cellFrame inView: (NSView *) controlView?

Mi código actual es

- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView*)controlView { 
     NSColor* textColor = [self isHighlighted] 
       ? [NSColor alternateSelectedControlTextColor] 
       : [NSColor darkGrayColor]; 
} 
+0

También realmente quieren una respuesta a esto! –

Respuesta

5

La mejor manera que he encontrado que no lo hace hacer que se ocupe de los que responden (ya que a veces la supervista de controlView es la respuesta o algunas tonterías) es usar el editor:

BOOL isEditing = [(NSTextField *)[self controlView] currentEditor] != nil; 

¡Fácil como eso!

+1

La pregunta es bastante antigua y la he resuelto como tú dices, gracias, respuesta aceptada :) – dafi

+0

¿Y también verifica que la ventana es la clave? ¿O eso es innecesario? '&& [self.window isKeyWindow]' – Gabriel

3

he encontrado una solución que utiliza el firstResponder, es simple y eficiente parece

- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView*)controlView { 
     NSColor* textColor; 

     if ([self isHighlighted]) { 
      textColor = [[controlView window] firstResponder] == controlView 
        ? [NSColor alternateSelectedControlTextColor] 
        : [NSColor yellowColor]; 
     } else { 
      textColor = [NSColor darkGrayColor]; 
     } 

     // use textColor 
     ... 
     ... 
     [super drawWithFrame:cellFrame inView:controlView]; 
    } 
+0

Lo encontré también, pero no marca el caso cuando la aplicación está desactivada. No puedo creer que no haya una mejor manera. –

+1

Solo necesita registrarse para las notificaciones 'NSApplicationDidResignActiveNotification' y' NSApplicationDidBecomeActiveNotification' y luego llame a '-setNeedsDisplay:' en la vista de tabla en el método que ha configurado para manejar la notificación. –

+0

¿Y supongo que también me registro para que las ventanas se activen e inactiven? Parece que hay mucho que hacer para una cosa de enfoque celular estándar. Debe haber una manera mejor escondida dentro de AppKit ... O tal vez tiempo para encapsularlo en un componente/categoría. –

2

una cosa más, el código anterior es perfecto, por eso si usted tiene varias ventanas que tendrá que comprobar si la ventana es clave

 if (controlView && ([[controlView window] firstResponder] == controlView) && [[controlView window] isKeyWindow]) { 
      [attributes setObject:[NSColor whiteColor] forKey:NSForegroundColorAttributeName]; 
     } 
Cuestiones relacionadas