2011-11-23 12 views
5

Estoy tratando de obtener un diseño de tabla como se muestra a continuación trabajando con NSTableViews basadas en vistas que se han introducido en Lion.¿Cómo agregar row-span en NSTableView basado en vistas?

Se describieron múltiples enfoques para NSTableViews basados ​​en células, p. Mimic the artwork column, pero estos no se aplican realmente a las vistas de tabla basadas en vistas.

La idea es que la tabla se llene con una matriz de objetos, en una (o más) columnas que abarcan filas que indican que los objetos comparten algunos datos en común. numberOfRowsInTableView: regresa al número total de elementos (19 en el caso de la imagen adjunta).

¿Alguien ha intentado algo como esto?

Disposición

Groups/sections displayed using spanning rows

Respuesta

5

Pude hacer esto por usando dos NSTableViews separadas que tienen el desplazamiento sincronizado de 0SSSSS de NSScrollView. Para saber cómo sincronizar varias vistas de desplazamiento (con el código de subclase exacto), lea Scroll View Programming Guide for Mac - Synchronizing Scroll Views

Tengo groupTableView que tiene una sola columna y muestra las vistas que representan el grupo. También tengo itemTableView que tiene columnas que representan los elementos del grupo. Uso los mismos métodos delegate/datasource con if-else-statements para verificar qué NSTableView se está utilizando y respondo de acuerdo con el número correcto de filas, vista de celda, etc. Además, implemento el siguiente método de delegado para ajustar la tabla de grupos de vista alto de fila a ser igual a la suma de las alturas de las filas tema de las filas en el grupo:

- (CGFloat)tableView:(NSTableView *)tableView heightOfRow:(NSInteger)row 
{ 
    if (tableView == self.groupTableView) { 
     NSUInteger firstRowIndexForGroup = ...; 
     NSUInteger lastRowIndexForGroup = ...; 
     CGFloat groupHeight = 0.0; 
     for (NSUInteger currentRowIndex = firstRowIndexForGroup; currentRowIndex <= lastRowIndexForGroup; currentRowIndex++) { 
      groupHeight += [self.itemTableView rectOfRow:lastRowIndexForGroup].size.height; 
     } 
     return groupHeight - [self.itemTableView intercellSpacing].height; 
    } else { 
     return self.itemTableView.rowHeight; 
    } 
} 

también debe llamar -noteHeightOfRowsWithIndexesChanged: cada vez que la vista de tabla necesita una visión de grupo porque la altura cambia de acuerdo con el número de filas en el grupo

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row 
{ 
    if (tableView == self.groupTableView) { 
     GroupRowView *view = [tableView makeViewWithIdentifier:tableColumn.identifier owner:self]; 
     // configure view 
     [tableView noteHeightOfRowsWithIndexesChanged:[NSIndexSet indexSetWithIndex:row]]; 
     return view; 
    } else { 
     ItemRowView *view = [tableView makeViewWithIdentifier:tableColumn.identifier owner:self]; 
     // configure view 
     return view; 
    } 
} 

Desactivé la selección de fila y las barras de desplazamiento horizontal y vertical en la vista de tabla de grupo. También hice la cuadrícula horizontal sólida para ambas vistas de tabla. Finalmente, ubico la vista de tabla de grupo directamente al lado de la vista de tabla de elementos sin espacio entre ellos, por lo que aparece como si fuera simplemente otra columna en una sola vista de tabla. El resultado es una implementación impecable que tiene un desfase cero entre las vistas de tabla. Para el usuario, parece como si fuera una vista de tabla única.

+0

¡Oh vaya! ¡Definitivamente esta es una solución que no llegaría a mi cabeza! Después de haber trabajado con desplazamiento sincronizado antes de que pueda ver cómo funciona. Probablemente, una cosa para agregar es que si se hace clic/seleccionar la celda del grupo, esto tendría que 'reenviar' la selección a la primera fila de la vista de tabla de elementos. – klotz

+0

También puede dividir la vista de tabla de grupo para contener opcionalmente dos filas por grupo, de esta manera puede hacer que la fila superior flote sobre las demás, de modo que si tiene un grupo grande, la información de grupo flota hasta que el último elemento de grupo se desplace pantalla. – Andrew

+0

¿Qué se te ocurrió para mantener sincronizadas las filas de la tabla de elementos con la tabla de grupos? ¿Cómo se evita que la tabla de artículos clasifique sus filas para que no se correspondan con el grupo al que se encuentran? – erynofwales

0

se puede no utilizar un NSOutlineView en su lugar? Está diseñado específicamente para tener soporte de agrupación.

+0

Pero, ¿cómo obtendría el valor de grupo en una celda con su altura siendo la altura total de todas las filas de nodo secundario en lugar de usar su propia fila? – klotz

Cuestiones relacionadas