2011-08-27 12 views
5

Todavía estoy luchando con el NSOutlineView basado en la vista en mi pequeña aplicación Cocoa. Estoy intentando modelar mi OutlineView después del buscador. Cuando Finder OutlineView pierde el foco (por ejemplo, haciendo clic en cualquier carpeta en el lado derecho), la fila seleccionada (por ejemplo, Escritorio) permanece seleccionada con el degradado azul brillante y no cambia al degradado azul-gris inactivo.gradiente de selección NSOutlineview basado en la vista

Me gustaría duplicar este comportamiento en mi aplicación.

En un OutlineView no basado en la vista, pude crear la subclase NSOutlineView y volver a aplicar (void)highlightSelectionInClipRect:(NSRect)clipRect, de modo que cada fila resaltada se pudiera suministrar con la imagen de fondo azul brillante.

Sin embargo, ahora con mi OutlineView basado en vistas (configurado en el estilo SourceList) este método aparentemente ni siquiera se llama. Incluso he implementado (id)_highlightColorForCell:(NSCell *)cell para devolver nada, como sugieren algunos sitios, pero eso tampoco ayuda.

¿Alguna sugerencia sobre cómo puedo establecer el degradado resaltado en el OutlineView basado en vistas?

+0

Tengo este problema exacto. – tofutim

Respuesta

8

¿Está haciendo algún dibujo personalizado que podría estar jugando con cosas? Por lo que puedo decir, todos los dibujos de selección se manejan normalmente, consulte el TableViewPlayground example (no el estilo de lista de origen de forma predeterminada, pero eso es un cambio fácil para el XIB).

Pero en su defecto, de acuerdo con el Mac OS X 10.7 doc entrada en highlightSelectionInClipRect:

Nota: Este método no debe tener subclases o anular para una vista de tabla vista base. En cambio, la personalización del dibujo de filas se debe hacer subclasificando NSTableRowView.

Así que creo (no he probado nada de esto) como te gustaría subclase NSTableRowView, anular drawSelectionInRect: (hay un example en TableViewPlayground, y señalar a su selección. Usted puede comprobar por ser la aplicación activa con [NSApp active] o tal vez utilizar la propiedad self.emphasized como el ejemplo hace

a continuación, volverías uno de sus NSTableRowViews personalizados en el método de protocolo de NSOutlineViewDelegate. (10.7 solamente!): (NSTableRowView *)outlineView:(NSOutlineView *)outlineView rowViewForItem:(id)item

Hope esto funciona/

ayuda!

Debo observar que el ejemplo TableViewPlayground usa el método de delegado outlineView:viewForTableColumn:item: de forma predeterminada y lo hace todo con NSTableViewCells, pero si agrega el método rowViewForItem que mencioné anteriormente, es llamado. Así que supongo que podrías usarlo para devolver una vista para cada fila en su totalidad.

6

Gracias, con su sugerencia, pude resolver el problema bastante fácilmente. Subclasé NSTableRowView y sobrescribí -(BOOL) isEmphasized para siempre devolver verdadero.

entonces implementadas -(NSTableRowView *)outlineView:(NSOutlineView *)outlineView rowViewForItem:(id)item en mi delegado OutlineViews para devolver una instancia específica elemento de mi subclase llamando ClbTableRowView *result = [outlineView makeViewWithIdentifier:identifier owner:self];

Editar: Además de eso, también parece ser una manera bastante oculto de la utilización de la costumbre NSTableRowView subclase al colocar un nuevo objeto NSView en el OutlineView en Interface Builder.A continuación, establezca la clase de vistas en su subclase y asígnele un identificador de elemento de interfaz de usuario de "NSTableViewRowViewKey", de acuerdo con Apple documentation.

+0

+1 para esa "NSTableViewRowViewKey". Me llevó algo de tiempo encontrar eso. Está bastante oculto de hecho –

Cuestiones relacionadas