NSTableView solo muestra " Celda de vista de tabla"


Tengo una 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 devuelva, 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 establecidos correctamente (también muestra el número adecuado de filas).

Lo que muestra la tablaintroduzca la descripción de la imagen aquí

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

Author: albertamg, 2011-09-23

6 answers

Simplemente cambie Content Mode a Cell Based para la vista de tabla en IB. IB mostrará Text Cell como marcadores de posición de celda, que se rellenan en tiempo de ejecución por lo que sea que regrese de tableView:objectValueForTableColumn:row:

 54
Author: JAWZapps,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-21 04:16:24

Finalmente lo descubrí. Mis celdas por alguna razón parecen contener tanto una vista de tabla COMO una celda de campo de texto. He eliminado los Table Cell View's y ahora todo está funcionando. No tengo idea de cómo llegué a ese estado.

introduzca la descripción de la imagen aquí

 10
Author: Kyle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-23 21:28:39

Versión más reciente 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, seleccione el"Inspector de atributos"
  3. Cambie el Modo de contenido a" Basado en celdas "en lugar de"Basado en vistas"
  4. Guarde los cambios y vuelva a ejecutar el proyecto.
 9
Author: Gaurav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-22 14:57:36

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, puedes irte. En el momento en que se hizo la pregunta, las tablas basadas en celdas eran la norma y cuando Apple cambió el componente de ventana a uno basado en vistas, obviamente causó mucha confusión. Hoy en día, los documentos de Apple recomiendan que use tablas basadas en vistas en lugar de tablas basadas en celdas.

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

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

Las Tablas Basadas En NSCell Siguen Siendo Compatibles En OS X v10. 6 y anteriores, cada celda de vista de tabla debía ser una subclase de NSCell. Este enfoque causó limitaciones al diseñar celdas personalizadas complejas, a menudo requiriendo que escribiera 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 siguen siendo compatibles con OS X v10. 7 y versiones posteriores, pero normalmente se usan solo para admitir código heredado. En general, debe usar tablas basadas en NSView.

 6
Author: psmythirl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-30 13:58:07

Parece que le falta el importante método de origen de datos -numberOfRowsInTableView:. Consulte Guía de Programación de Vista de tabla: (Vista de tabla basada en vista) Los Métodos Requeridos y 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 obtener más detalles.

Básicamente, el primer método NSTableViewDataSource que se llama es numberOfRowsInTableView:. Solo después de devolver una cantidad distinta de cero dentro de ese método, los siguientes métodos tableView:objectValueForTableColumn:row: o tableView:willDisplayCell:forTableColumn:row: serán called.

 1
Author: NSGod,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-23 20:16:44

Está malinterpretando cómo el resultado de -tableView:objectValueForTableColumn:row: es utilizado por los frameworks.

Para hacer más o menos lo que está tratando de lograr anteriormente, anule el método delegado -tableView:willDisplayCell:forTableColumn:row: en su lugar. Aquí hay un ejemplo cribbed 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", usando tablas basadas en celdas (que siguen siendo las predeterminadas).

 0
Author: Kaelin Colclasure,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-23 19:26:03