2011-03-26 11 views
9

Estoy tratando de crear un seccionado NSTableView usando NSArrayController y enlaces de cacao. Estoy buscando un enfoque similar al NSFetchedResultsController en iOS, donde puede establecer una ruta de clave de sección. Quiero hacer algo similar con NSArrayController.NSTableView seccionado usando NSArrayController

Le doy un ejemplo: Tengo diferentes tareas. Cada tarea tiene una de tres prioridades diferentes, bajo, medio o alto. Las tareas también tienen atributos como título, descripción, fecha, etc. Quiero seccionar o agrupar las tareas por prioridad (la ruta de la clave de sección aquí es la prioridad).

¿Puedo resolver este problema con enlaces y NSArrayController? ¿Necesito múltiples NSArrayController o solo uno?

+0

Pruebe este https://developer.apple.com/library/mac/samplecode/TableViewPlayground/Introduction/Intro.html – johndpope

Respuesta

7

Aunque NSTableView pueden representar filas de grupos, desafortunadamente depende del delegado o de la fuente de datos para aplanar la jerarquía. No comprende la semántica de fuentes de datos alternativas como UITableView 's , ni NSArrayController tienen equivalentes a los métodos de sección NSFetchedResultsController.

Una opción es NSOutlineView que está diseñada para mostrar datos jerárquicos arbitrarios, pero probablemente crea más trabajo de lo necesario para una estructura simple de dos niveles. (Puede enlazar una vista de esquema para NSTreeController pero el controlador árbol no está bien documentado, y para arrancar, está mal diseñado.)

Por lo tanto, esto es lo que sugiero:

  • Escriba su propia clase controlador que implementa NSTableViewDelegate y NSTableViewDataSource.
  • Utilice un único controlador de matriz que ordena por prioridad, y escriba su propio código para compensar los índices de fila para acomodar los títulos de sección.
  • Devuelve YES desde tableView:isGroupRow: en los encabezados de las secciones.
  • No utilice enlaces para este.

También podría buscar un controlador reutilizable y con capacidad de encuadernación de un tercero.

+0

¡Es posible usar enlaces para los campos NSTableCell junto con encabezados de sección hechos a sí mismos! Debería implementar los métodos 'NSTableViewDelegate'' tableview: isGroupRow: 'y' tableView: rowViewForRow: '. Puede omitir la implementación de 'tableview: viewForTableColumn: row', se puede hacer a través de enlaces. –

0

usted tiene que llenar NSArrayController manualmente con instancias de la clase personalizada que exactamente sostiene el contenido de la NSTableView desea lograr, incluidas las filas del grupo. El controlador debe llenarse en el orden correcto. Por lo tanto, debe comenzar con un objeto de encabezado de grupo, luego algunos objetos de datos, un nuevo objeto de encabezado, etc. La clase personalizada debe contener las siguientes propiedades:

  1. Valor de cadena para el encabezado del grupo. Es nulo cuando la fila no es un encabezado de grupo.
  2. Valor booleano isGroupHeader. Necesario para una implementación fácil tableView:isGroupRow:.
  3. Valor de NSManagedObject para sus datos normales. Es nulo cuando la fila es un encabezado de grupo.

Con esto tiene todas las herramientas para implementar todos los delegados de NSTableView para obtener una vista de tabla correctamente agrupada.

Cuestiones relacionadas