2012-06-06 18 views
18

Ho una vista nstableview basata. Voglio colorare intera riga sulla base di alcuni condtion per cui ho usato il codice qui sottoColorare le righe in Vista NSTableview basata

- (NSTableRowView *)tableView:(NSTableView *)tableView rowViewForRow:(NSInteger)row 
{ 
    NSTableRowView *view = [[NSTableRowView alloc] initWithFrame:NSMakeRect(1, 1, 100, 50)]; 

    [view setBackgroundColor:[NSColor redColor]]; 
    return view;; 
} 

Il metodo delegato si chiama, ma tavolo non sembra essere utilizzando NSTableRowView restituito dal metodo delegato.

L'obiettivo principale qui è colorare l'intera riga in base ad alcune condizioni. Cosa c'è di sbagliato nell'attuazione di cui sopra?

+0

Per impostare backgroundColor, è necessario usare '- (void) tableView: fila (NSInteger) nella tua NSTableViewDelegate.' Vedere la mia risposta più dettagliata di seguito: (NSTableView *) tableView didAddRowView: (NSTableRowView *) rowView forRow. – DPlusV

risposta

0

Se si guarda la presentazione sulle visualizzazioni di tabelle basate sulla vista dal WWDC 2011, si noterà che l'idea principale è creare le viste in Interface Builder e quindi ottenerle da lì. Qualcosa di simile:

[tableView makeViewWithIdentifier:@"GroupRow" owner:self]; 

Dopo aver ottenuto la vista, è sufficiente impostare le sue proprietà e restituirlo.

Nota in questo esempio che ha il proprio identificativo, quindi ricordarsi di impostarlo, ma è anche possibile utilizzare identificativi automatici.

Non so se un collegamento diretto al WWDC funzionerà, ma la pagina principale è qui: https://developer.apple.com/videos/wwdc/2011/ e se si cerca "View Based NSTableView Basic to Advanced", lo troverete. Vale la pena guardare.

+0

userò i binding per popolare i dati sulla riga – sach

+0

sì .. voglio usare la vista basata su – sach

1

Infine ha funzionato come di seguito

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

{ 
     NSView *cellView = (NSView*) [tableView makeViewWithIdentifier:[tableColumn identifier] owner:[tableView delegate]]; 
     CALayer *viewLayer = [CALayer layer]; 
     [viewLayer setBackgroundColor:[[NSColor redcolor] CGColor]]; 
     [cellView setWantsLayer:YES]; 
     [cellView setLayer:viewLayer]; 
     return cellView; 
    } 

Si prega di notare .. u bisogno per convertire nscolor a cgcolor che potete trovare in https://gist.github.com/707921 o http://forrst.com/posts/CGColor_Additions_for_NSColor-1eW

+3

Questo approccio è un hack: imposta le singole viste delle celle come layer-hosting (che non è sempre quello che vuoi), e non cambia lo stile dell'intera riga. Vedi la mia risposta in questa pagina per un approccio documentato. – DPlusV

36

Per chiunque altro che colpisce questo e vuole un costume NSTableRowView backgroundColor, ci sono due approcci.

  1. Se non avete bisogno di disegno personalizzato, è sufficiente impostare rowView.backgroundColor in - (void)tableView:(NSTableView *)tableView didAddRowView:(NSTableRowView *)rowView forRow:(NSInteger)row nel vostro NSTableViewDelegate.

    Esempio:

    - (void)tableView:(NSTableView *)tableView 
        didAddRowView:(NSTableRowView *)rowView 
          forRow:(NSInteger)row { 
    
        rowView.backgroundColor = [NSColor redColor]; 
    
    } 
    
  2. Se si ha bisogno il disegno personalizzato, creare il proprio NSTableRowView sottoclasse con drawRect desiderato. Quindi, implementare quanto segue in NSTableViewDelegate:

    Esempio:

    - (NSTableRowView *)tableView:(NSTableView *)tableView 
           rowViewForRow:(NSInteger)row { 
        static NSString* const kRowIdentifier = @"RowView"; 
        MyRowViewSubclass* rowView = [tableView makeViewWithIdentifier:kRowIdentifier owner:self]; 
        if (!rowView) { 
         // Size doesn't matter, the table will set it 
         rowView = [[[MyRowViewSubclass alloc] initWithFrame:NSZeroRect] autorelease]; 
    
         // This seemingly magical line enables your view to be found 
         // next time "makeViewWithIdentifier" is called. 
         rowView.identifier = kRowIdentifier; 
        } 
    
        // Can customize properties here. Note that customizing 
        // 'backgroundColor' isn't going to work at this point since the table 
        // will reset it later. Use 'didAddRow' to customize if desired. 
    
        return rowView; 
    } 
    
+0

Funziona se si utilizza una visualizzazione tabella basata su celle? Ho l'impressione che non lo sia, ma volevo solo verificare. – Kyle

+1

Sei il mio risparmiatore di tempo! Grazie per aver condiviso come utilizzare rowViewForRow delegate. – Tommy

+2

Grazie! Questo ha funzionato perfettamente. Prima ho trovato questo ero un po 'confuso su come aggiungere la mia riga sottoclasse, ma questo fa miracoli. –

0

ho ri-scritto l'approccio layer. In Swift 3,2

func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? { 

    let greenCell = self.tableview.make(withIdentifier: "green", owner: self) 
    let layer:CALayer = CALayer() 
    layer.backgroundColor = NSColor.green.cgColor 

    greenCell?.wantsLayer = true 
    greenCell?.layer = layer 

    return greenCell 

} 

Non dimenticare di modificare l'identificatore della cella in base al vostro storyboard, e nel "verde" identificatore del codice. E sicuramente, il colore dello sfondo, se vuoi.

Problemi correlati