objective-c cocoa nstableview

objective c - NSTableView solo muestra "Celda de vista de tabla"



objective-c cocoa (6)

Tengo un NSTableView con el delegado y la fuente de datos apuntando a mi controlador. He intentado implementar el

- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex

Método, pero no importa lo que regrese, la tabla siempre muestra "Celda de vista de tabla" en los datos. ¿Alguna idea de lo que podría estar haciendo mal? Adjunto hay dos fotos que muestran que tengo los delegados configurados correctamente (también muestra el número correcto de filas).

Tenga en cuenta que también he intentado devolver @"Hello World" para todo, pero obtengo el mismo resultado.


Finalmente lo descubrí. Por alguna razón, mis celdas parecen contener una TableCellView Y una celda de campo de texto. Eliminé la Table Cell View y ahora todo está funcionando. No tengo idea de cómo llegué en ese estado.


La mayoría de las respuestas implican convertir el componente de vista de tabla a una vista de tabla basada en celdas. Si eso es lo que quieres, está bien, estás listo para ir. En el momento en que se formuló la pregunta, las tablas basadas en celdas eran la norma y cuando Apple cambió el componente de ventana por uno basado en visualización, obviamente causó mucha confusión. Hoy, los documentos de Apple recomiendan que use tablas basadas en vistas en lugar de celdas.

El problema descrito en la pregunta surge si usa - tableView:objectValueForTableColumn:row: en su - tableView:objectValueForTableColumn:row: datos. No puede usar este método con tablas basadas en vista, solo es para tablas basadas en celdas. En su lugar, debe usar el método - tableView:viewForTableColumn:row: No necesita hacer que el objeto se ajuste al protocolo NSTableViewDelegate para usar este método, pero se debe establecer como el delegado de la tabla.

En respuesta a Cœur, citando los documentos de Apple en línea.

Todavía se admiten tablas basadas en NSCell En OS X v10.6 y anteriores, se requería que cada celda de vista de tabla fuera una subclase de NSCell. Este enfoque causó limitaciones al diseñar celdas personalizadas complejas, que a menudo requieren que escriba sus propias subclases NSCell. Proporcionar animación, como vistas de progreso, también fue extremadamente difícil. En este documento, estos tipos de vistas de tabla se denominan vistas de tabla basadas en NSCell. Las tablas basadas en NSCell continúan siendo compatibles con OS X v10.7 y posterior, pero normalmente se usan solo para admitir código heredado. En general, debe usar tablas basadas en NSView.


No está entendiendo cómo los -tableView:objectValueForTableColumn:row: el resultado de -tableView:objectValueForTableColumn:row:

Para hacer más o menos lo que intenta lograr arriba, anule el método de delegado -tableView:willDisplayCell:forTableColumn:row: lugar. Aquí hay un ejemplo de una de mis propias aplicaciones:

- (void)tableView:(NSTableView *)tableView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row; { NSString * displayName = [self.senders objectAtIndex:row]; [cell setTitle:displayName]; [cell setState:[self.selection containsObject:displayName]]; }

Esta es la forma de la "vieja escuela", utilizando tablas basadas en celdas (que todavía son las predeterminadas).


Nueva versión de XCode:

  1. Seleccione la vista de tabla (asegúrese de que la vista de desplazamiento o cualquier otra vista no esté seleccionada).
  2. En el lado derecho, selecciona "Inspector de atributos"
  3. Cambie el modo de contenido a "Basado en celda" en lugar de "Basado en vista"
  4. Guarde sus cambios y vuelva a ejecutar el proyecto.

Parece que le falta el importantísimo -numberOfRowsInTableView: fuente de datos. Consulte la Guía de programación de Vista de tabla: (Vista de tabla basada en vista) Los métodos requeridos y la Guía de programación de vista de tabla: (vista de tabla basada en celdas) Proporcionar datos a una vista de tabla mediante programación para más detalles.

Básicamente, el primer método NSTableViewDataSource que se llama es numberOfRowsInTableView: Solo después de devolver una cantidad que no sea cero desde ese método, se tableView:objectValueForTableColumn:row: los siguientes tableView:objectValueForTableColumn:row: o tableView:willDisplayCell:forTableColumn:row: methods.


Simplemente cambie el Content Mode a Cell Based para la vista de tabla en IB. IB mostrará Text Cell como los marcadores de posición de celdas, que se rellenan en tiempo de ejecución con lo que devuelva de tableView:objectValueForTableColumn:row: