2012-10-08 12 views
6

Vorrei creare un NSTableview con NSTableCellViews personalizzate.Custom NSTableView con NSTableCellView personalizzato?

Ecco quello che ho in questo momento:

  • Un file pennino per la cella (vista pennino) chiamato CustomCell.xib
  • una classe personalizzata per il mio cellulare chiamato CustomCell
  • E il codice nel mio AppDelegate.m:

H ere Creo il mio vista tabella di programmazione:

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]; 

E qui è il metodo delegato in cui vorrei mettere la mia cella codice personalizzato:

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

Nel file pennino per la mia cella personalizzato ho agganciato la vista cella con la mia classe personalizzata denominata CustomCell che sottoclasse NSTableCellView. Non ho fatto altri passi come ora. Quindi il mio CustomCell.m è solo un codice di inizializzazione predefinito. Non l'ho toccato E non ho fatto nient'altro nel mio file di pennino, quindi non ho cambiato il proprietario del file o qualcosa del genere perché non so davvero cosa fare. Qualcuno può dare una mano? Ho esaminato i file di esempio dalla documentazione di Apple, ma dopo giorni di ricerche non ho trovato alcuna soluzione. Apprezzerei molto se tu potessi aiutarmi.

+0

Puoi chiarire qual è il problema? Ho letto il tuo post un paio di volte e non riesco a discernere quale problema stai riscontrando. – FluffulousChimp

+0

Ho un NSTableView e voglio celle con un aspetto personalizzato. Così ho impostato un file di visualizzazione pennino in cui ho appena questa cella NSTableCellView. Ora, desidero programmare a livello di codice il mio NSTableView per visualizzare quelle particolari celle dal file pennino. Tuttavia il codice sopra non cambia davvero nulla nella mia tabella. Ha senso ? –

+0

hai risolto questo? Ho inciampato per lo stesso problema ... – Gossamer

risposta

3

Questo è quello che ho finito per fare:

Naturalmente bisogna sottoclasse NSTableCellView e restituirlo come ho fatto qui di seguito. Se si ha familiarità con viste tavolo in iOS è necessario avere familiarità con i metodi come:

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

E il metodo click che si attiva quando viene selezionata una riga sarebbe simile a questa:

-(void)click{ 

    int index = [table selectedRow]; 

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

} 

E qualcosa che deve essere aggiunto a NSTableView:

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

Non è necessario sottoclasse NSTableView per creare sottoclassi NSTableViewCell personalizzate. Si potrebbe considerare l'utilizzo di una vista basata su Table View anche ...

Problemi correlati