Pregunta

¿Cuál sería la forma más fácil o recomendado para hacer una NSOutlineView guión varias columnas? Por defecto, sólo se aplica una sangría columna del contorno; y por lo que yo sé que no hay soporte integrado para hacerla sangrar otras columnas.

Tengo una NSOutlineView que muestra una comparación entre dos conjuntos de datos jerárquicos. Para el atractivo visual, si algún elemento de la columna contorno tiene sangría, me gustaría para sangrar el elemento en la misma fila en otra columna en la misma cantidad de indentación. (También hay una tercera columna que muestra el resultado de la comparación de los dos elementos, esta columna nunca debe tener una sangría.)

Puede esto sólo puede lograrse creando una subclase NSOutlineView? Y lo que tendría que ser anulado en la subclase? ¿O hay una manera más fácil de conseguirlo para sangrar varias columnas?

¿Fue útil?

Solución

Resulta ser más fácil de lo que esperaba. He aquí un esbozo de la solución. Para sangrar una columna distinta de la columna del contorno en un NSOutlineView, puede:

  • Crear una subclase de la clase NSCell que va a utilizar para esa columna, digamos MYIndentedCell
  • Añadir una variable de instancia indentation a MYIndentedCell, y proporcionar un método mutador de acceso y para ello
  • Override al menos drawWithFrame: inView: en MYIndentedCell a:
     - (void) drawWithFrame: (NSRect) frame inView: (NSView*) view
     {
       NSRect newFrame = frame;
       newFrame.origin.x += indentation;
       newFrame.size.width -= indentation;
       [super drawWithFrame: newFrame inView: view];
     }
  • Usted tendrá que anular también editWithFrame:inView y selectWithFrame:inView: similar a la anterior, si la columna se podrá editar
  • Reemplaza el tamaño de celda a:
     - (NSSize) cellSize
     {
       NSSize cellSize = [super cellSize];
       cellSize.width += indentation;
       return cellSize;
     }
  • Por último, conseguir la hendidura en la columna para seguir la huella de la columna contorno del NSOutlineView será manejado por el delegado de la vista de esquema. El delegado tiene que poner en práctica lo siguiente:
     - (void) outlineView: (NSOutlineView *) view
              willDisplayCell: (id) cell
              forTableColumn: (NSTableColumn *) column
              item: (id) item
     {
       if (column == theColumnToBeIndented) {
         [cell setIndentation:
                  [view indentationPerLevel] * [view levelForItem: item]];
       }
     }

Si aún tiene problemas con su funcionamiento, es posible que desee echar un vistazo a ImageAndTextCell.m en SourceView código de ejemplo que me pareció muy útil para encontrar la manera de hacer lo anterior.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top