2012-10-08 14 views
6

Ich möchte eine NSTableview mit benutzerdefinierten NSTableCellViews erstellen. HierBenutzerdefinierte NSTableView mit benutzerdefinierten NSTableCellView?

ist, was ich jetzt haben:

  • Eine Nib-Datei für die Zelle (Ansicht nib) genannt CustomCell.xib
  • Eine benutzerdefinierte Klasse für meine Zelle genannt CustomCell
  • Und der Code in meinem AppDelegate.m:

H ere Ich eröffne meine Tabellenansicht programmatisch:

NSScrollView *tableContainer = [[NSScrollView alloc]initWithFrame:NSMakeRect(self.window.frame.size.width-TABLEWIDTH, 0, TABLEWIDTH, self.window.frame.size.height)]; 
    NSTableView *tableView = [[NSTableView alloc] initWithFrame:NSMakeRect(self.window.frame.size.width-TABLEWIDTH, 0, TABLEWIDTH, self.window.frame.size.height)]; 

    NSTableColumn *firstColumn = [[[NSTableColumn alloc] initWithIdentifier:@"firstColumn"] autorelease]; 
    [[firstColumn headerCell] setStringValue:@"First Column"]; 
    [tableView addTableColumn:firstColumn]; 

    tableView.dataSource = self; 
    tableView.delegate = self; 
    [tableContainer setDocumentView:tableView]; 
    tableContainer.autoresizingMask = NSViewHeightSizable | NSViewMinXMargin; 
    [self.window.contentView addSubview: tableContainer]; 

Und hier ist die delegierte Methode, wo Ich mag würde meinen benutzerdefinierte Zelle Code setzen:

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { 


    // In IB the tableColumn has the identifier set to the same string as the keys in our dictionary 
    NSString *identifier = [tableColumn identifier]; 

    if ([identifier isEqualToString:@"myCell"]) { 

     // We pass us as the owner so we can setup target/actions into this main controller object 
     CustomCell *cellView = [tableView makeViewWithIdentifier:identifier owner:self]; 
     // Then setup properties on the cellView based on the column 
     cellView.textField.stringValue = @"Name"; 
     return cellView; 
    } 
    return nil; 
} 

In der Nib-Datei für meine benutzerdefinierte Zelle ich süchtig habe herauf die Zellansicht mit meiner benutzerdefinierten Klasse namens CustomCell welche Unterklassen NSTableCellView. Ich habe bisher keine anderen Schritte gemacht. Also meine CustomCell.m ist nur Standard-Initialisierungscode. Ich habe es nicht angerührt. Und ich habe nichts anderes in meiner NIB-Datei gemacht, also habe ich den Eigentümer der Datei nicht geändert, weil ich nicht wirklich weiß, was ich tun soll. Kann jemand helfen? Ich habe mir Beispieldateien aus der Apple-Dokumentation angeschaut, aber nach Tagen der Recherche habe ich keine Lösungen gefunden. Ich würde es sehr schätzen, wenn Sie mir helfen könnten.

+0

Können Sie klären, was das Problem ist? Ich habe Ihren Beitrag ein paar Mal gelesen und kann nicht erkennen, welches Problem Sie haben. – FluffulousChimp

+0

Ich habe eine NSTableView und ich möchte Zellen mit einer benutzerdefinierten Darstellung. Also habe ich eine Nib-View-Datei eingerichtet, wo ich gerade diese NSTableCellView-Zelle habe. Jetzt möchte ich mein NSTableView programmatisch dazu bringen, diese bestimmten Zellen aus der NIB-Datei anzuzeigen. Der obige Code ändert jedoch nichts an meiner Tabelle. Macht Sinn ? –

+0

hast du das gelöst? Ich stolpere auf das gleiche Problem ... – Gossamer

Antwort

3

mit einer ansichtsbasierte Tabellenansicht betrachten Dies ist, was ich am Ende tun:

Natürlich Sie NSTableCellView Unterklasse müssen und senden Sie es wie ich unten war.

- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView{ 
    //this will be called first. It will tell the table how many cells your table view will have to display 
    return [arrayToDisplay count]; 

} 

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { 

    //this is called after the count of rows is set. It will populate your table according to the data your array to display contains 

    [tableView setTarget:self]; 
    [tableView setAction:@selector(click)]; 

    NSString *identifier = [tableColumn identifier]; 

    if ([identifier isEqualToString:@"TheCell"]) { 

     CustomCell *cellView = [tableView makeViewWithIdentifier:identifier owner:self]; 
     cellView.cellText.stringValue = [arrayToDisplay objectAtIndex:row]; 
     return cellView; 
    } 

    return nil; 
} 

Und die click Methode, die ausgelöst wird, wenn eine Zeile ausgewählt wird, würde wie folgt aussehen: Wenn Sie mit Tabellenansichten in iOS vertraut sind, sollten Sie mit Methoden wie vertraut sein

-(void)click{ 

    int index = [table selectedRow]; 

    // Do something with your data 
    //e.g 
    [[arrayToDisplay objectAtIndex:index] findHiggsBoson]; 

} 

Und etwas das muss dem NSTableView hinzugefügt werden:

NSTableColumn *column = [[NSTableColumn alloc] initWithIdentifier:@"column"]; 
column.width = self.frame.size.width; 
[tableView addTableColumn:column]; 
1

Sie müssen keine Unterklasse von NSTableView erstellen, um benutzerdefinierte NSTableViewCell-Unterklassen zu haben. Vielleicht haben Sie auch ...