NSTableView con più colonne
-
18-09-2019 - |
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ì.
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.