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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top