Pregunta

¿Qué es una manera fácil de configurar mi NSTableView con varias columnas para mostrar sólo ciertos datos en una columna. Tengo los IBOutlets establecidos, pero no sé a dónde ir desde allí.

¿Fue útil?

Solución

Suponiendo que no está utilizando cacao Vinculaciones / Core Data, puede mostrar datos en un NSTableView mediante la aplicación de dos métodos de la protocolo NSTableViewDataSource . Normalmente el controlador implementará el protocolo, por lo que abrir el archivo .m controlador y añadir estos métodos para @implementation del controlador:

- (NSInteger)numberOfRowsInTableView:(NSTableView*)tableView {
  return 25;  // fill this out
}

– (id) tableView:(NSTableView*)tableView
       objectValueForTableColumn:(NSTableColumn*)column
       row:(int)row {
  return row % 3 ? @"Tick..." : @"BOOM!";  // fill this out
}

Es necesario establecer la propiedad dataSource de la tabla para el controlador. En Interface Builder de control de arrastre desde la vista de tabla al controlador y establecer dataSource. Ahora generar y ejecutar y debería ver sus datos en la tabla.

Si sólo desea llenar una columna, añadir una IBOutlet NSTableColumn * al controlador; vamos a llamarlo explosiveColumn. En el Interface Builder, control de arrastre desde el controlador a la columna que desea rellenar y fijar explosiveColumn. Luego, en tableView: objectValueForTableColumn: fila: se puede probar si el parámetro column es el mismo objeto como el que la salida se establece en:

– (id) tableView:(NSTableView*)tableView
       objectValueForTableColumn:(NSTableColumn*)column
       row:(int)row {
  if (column == explosiveColumn) {
    return row % 3 ? @"Tick..." : @"BOOM!";
  } else {
    // other columns blank for now
    return nil;
  }
}

Este tutorial podría ser útil: http://www.cocoadev.com/index.pl? NSTableViewTutorial

Otros consejos

Aquí está un ejemplo el uso de múltiples vistas de tabla con los métodos de la fuente de datos y una aplicación basada documento:

#pragma mark - Data Source Methods
- (NSInteger) numberOfRowsInTableView:(NSTableView *)tv
{
    if (tv == racerTableView)
        return [racerList count];
    else if (tv == vehicleTableView)
        return [vehicleList count];
    else
        return 0; // something wrong here...
}

- (id)tableView:(NSTableView *)tv objectValueForTableColumn:(NSTableColumn *)col
        row:(NSInteger)rowi
{
    NSString *colid = [col identifier];
    if (tv == racerTableView){
        NHRacers *racer = [racerList objectAtIndex:rowi];
        return [racer valueForKey:colid];
    }
    else if (tv == vehicleTableView){
        NHVehicles *vehicle = [vehicleList objectAtIndex:rowi];
        return [vehicle valueForKey:colid];
    }
    else
        return 0; // something wrong here...
}

- (void)tableView:(NSTableView *)tv setObjectValue:(id)obj forTableColumn:(NSTableColumn *)col row:(NSInteger)rowi
{
    NSString *colid = [col identifier];
    if (tv == racerTableView) {
        NHRacers *racer = [racerList objectAtIndex:rowi];
        [racer setValue:obj forKey:colid];
    }
    else if (tv == vehicleTableView){
        NHVehicles *vehicle = [vehicleList objectAtIndex:rowi];
        [vehicle setValue:obj forKey:colid];
    }
    else
        nil; // something wrong here...    
    [self updateChangeCount:NSChangeDone];
}

El tableview puntos de origen de datos se establecen para el propietario del archivo y el propietario del archivo ha establecido vehicleTableView y racerTableView a sus respectivos "Tabla" en el IB. Los controles fundamentales colid el identificador (establecido en IB mediante la selección de la columna de la vista de la tabla bajo la "Identidad" desplegable, mientras que se muestra la "Identidad Inspector"). Estos valores fueron elegidos para ser el KVC (clave de codificación) que cumplen con las propiedades de las clases que se muestran en las vistas de tabla:. Usar minúsculas primera letra (ver documentos de manzana para el descanso)

Por ejemplo: (En NHVehicles.h)

@interface NHVehicles : NSObject
{
    NSUInteger entry;
    NSString *name;
    NSString *vehicleClass;
}
@property NSUInteger entry;
@property NSString *name, *vehicleClass;
@end

(en NHVehicles.m)

@implementation NHVehicles
@synthesize entry, name, vehicleClass;
@end

para este tableView, "entrada", "name" y "vehicleClass" se escribiría (w / o ") en los campos de identificación de sus respectivas columnas.

Si no desea mostrar algunos datos en la clase, simplemente no entran en la clave para el identificador de la columna. Una palabra de precaución: Estoy usando Xcode 4.5.1 y me di cuenta de que una vez que había entrado un par de claves para unos identificadores de columna en particular y luego cambió de opinión acerca y trató de borrar el texto, se quejó cuando he eliminado el texto de la campo identificador (que ya no podía abandonar el campo en blanco para las columnas que había editado). Esto no era difícil de evitar, pero fue una sorpresa.

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