NSTableView mit mehreren Spalten
-
18-09-2019 - |
Frage
Was ist eine einfache Möglichkeit, meine NSTableView mit mehreren Spalten einrichten, um nur bestimmte Daten in einer Spalte angezeigt werden soll. Ich habe die IBOutlets einrichten, aber ich weiß nicht, wo von dort aus gehen.
Lösung
Sie sind nicht mit Cocoa Bindungen / Core Data Unter der Annahme, man kann aus dem NSTableViewDataSource Protokoll. Typischerweise implementieren Ihre Controller das Protokoll, öffnen Sie so den Controller .m-Datei und fügen Sie diese Methoden an die @implementation
des Controllers:
- (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
}
Sie müssen die Tabellen dataSource
Eigenschaft an den Controller einzustellen. In Interface Builder Steuer zieht aus der Tabelle im Hinblick auf die Steuerung und setzen dataSource
. Jetzt erstellen und ausführen und Sie sollten Ihre Daten in der Tabelle sehen.
Wenn Sie nur eine Spalte zu füllen, fügen Sie ein IBOutlet NSTableColumn * auf dem Controller; nennen wir es explosiveColumn
. In Interface Builder, Steuer ziehen Sie von der Steuerung an die Spalte Sie ausfüllen wollen und setzen explosiveColumn
. Dann in Tableview: objectValueForTableColumn: Reihe: Sie können testen, ob der column
Parameter das gleiche Objekt als derjenige ist, der Ausgang ist eingestellt auf:
– (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;
}
}
Dieses Tutorial könnte nützlich sein: http://www.cocoadev.com/index.pl? NSTableViewTutorial
Andere Tipps
Hier ist ein Beispiel mehrerer Tabellenansichten mit Datenquelle Methoden und ein Dokument-basierte Anwendung mit:
#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];
}
Der Tableview Datasource Stellen an den Besitzer der Datei gesetzt sind und die Besitzer der Datei hat vehicleTableView und racerTableView zu ihrem jeweiligen „Table View“ in der IB gesetzt. Die colid Schlüssel überprüft die Kennung (gesetzt in IB durch die Tabellenansicht Spalte unter der „Identität“ Auswählen Dropdown, während die „Identität Inspektor“ angezeigt wird). Diese Werte wurden gewählt, die KVC zu sein (Key-Codierung kompatibel) Eigenschaften der Klassen in den Tabellenansichten angezeigt werden. Verwenden Kleinbuchstaben Anfangsbuchstaben (Apfel docs für Ruhe sehen)
Zum Beispiel: (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
für diesen Tableview "Eintrag", "name" und "vehicleClass" würde eingegeben werden (w / o „) in die Kennung Felder für ihre jeweiligen Spalten.
Wenn Sie nicht einige Daten in der Klasse zeigen wollen, nicht einfach den Schlüssel für die Spalte Kennung eingeben. Ein Wort der Vorsicht: Ich Xcode 4.5.1 verwenden, und ich bemerkte, dass ich einmal ein paar Tasten für eine bestimmte Spalte Kennungen eingegeben hatte und dann über meine Meinung geändert und versuchte, den Text zu klären, beschwerte es, wenn ich den Text aus dem gelöscht Kennungsfeld (ich nicht mehr konnte das Feld leer, für die Spalten lassen, die ich bearbeitet hatte). Das war nicht schwer, um zu arbeiten, aber es war eine Überraschung.