Domanda

Che cosa è un modo semplice per impostare il mio NSTableView con più colonne per visualizzare solo determinati dati in una colonna. Ho le IBOutlets impostare, ma non so dove andare da lì.

È stato utile?

Soluzione

Supponendo che non si sta usando Cocoa Associazioni / Core Data, è possibile visualizzare i dati in un NSTableView mediante l'attuazione di due metodi dal protocollo NSTableViewDataSource . In genere il controller sarà implementare il protocollo, in modo da aprire il file di controllo .m e aggiungere questi metodi per @implementation del controllore:

- (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
}

È necessario impostare la proprietà dataSource della tabella per il controller. In Interface Builder controllo trascinate dalla vista tabella al controllore e impostare dataSource. Ora costruire e gestire e si dovrebbe vedere i dati nella tabella.

Se solo si desidera compilare una colonna, aggiungere un IBOutlet NSTableColumn * al controller; chiamiamolo explosiveColumn. In Interface Builder, il controllo trascinare dal controller alla colonna che si desidera compilare e impostare explosiveColumn. Poi, in tableView: objectValueForTableColumn: fila: è possibile verificare se il parametro column è lo stesso oggetto come quella che l'uscita è impostata:

– (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;
  }
}

Questo tutorial può essere utile: http://www.cocoadev.com/index.pl? NSTableViewTutorial

Altri suggerimenti

Ecco un esempio utilizzando più visualizzazioni di tabella con i metodi di origine dati e un'applicazione basata 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];
}

Il Tableview prese origine dati sono impostate per il proprietario del file e proprietario del file ha fissato vehicleTableView e racerTableView alle loro rispettive "Table View" nella IB. I controlli principali colid l'identificatore (impostato in IB selezionando la colonna vista tabella sotto la "identità" discesa, mentre viene mostrato il "Identità ispettore"). Questi valori sono stati scelti per essere il KVC (chiave di codifica compliant) proprietà delle classi di essere visualizzata in vista tabella:. Usa minuscole prima lettera (vedi Documentazione di mele per il riposo)

Ad esempio: (In NHVehicles.h)

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

(in NHVehicles.m)

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

per questo tableView, "ingresso", "nome" e "vehicleClass" sarebbe stato digitato (w / o ") nei campi identificatore per le loro rispettive colonne.

Se non si desidera visualizzare alcuni dati nella classe, semplicemente non entrano la chiave per l'identificatore di colonna. Una parola di cautela: Sto usando Xcode 4.5.1 e ho notato che una volta ero entrato pochi tasti per particolari identificatori di colonna e poi cambiato idea circa e cercato di cancellare il testo, si è lamentato quando ho cancellato il testo dalla campo identificativo (non potevo più lasciare vuoto il campo per le colonne che avevo modificato). Questo non era difficile da risolvere, ma è stata una sorpresa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top