2011-11-23 9 views
5

Sto cercando di ottenere un layout di tabella come illustrato di seguito che funziona con NSTableViews basati sulla vista introdotte in Lion.Come aggiungere row-span in NSTableView basato su visualizzazione?

Sono stati descritti diversi approcci per NSTableViews basati su celle, ad es. Mimic the artwork column, ma questi non si applicano in realtà per le visualizzazioni delle tabelle basate su viste.

L'idea è che la tabella venga popolata da una serie di oggetti, in una (o più) colonne che si estendono su righe che indicano che gli oggetti condividono alcuni dati in comune. numberOfRowsInTableView: restituisce il numero totale di elementi (19 nel caso dell'immagine allegata).

Qualcuno ha provato qualcosa del genere?

layout

Groups/sections displayed using spanning rows

risposta

5

Sono stato in grado di farlo tramite utilizzando due NSTableViews separati che hanno lo scorrimento di NSScrollView sincronizzato. Per informazioni su come sincronizzare più visualizzazione di scorrimento (con il codice esatto della sottoclasse) leggere Scroll View Programming Guide for Mac - Synchronizing Scroll Views

Ho groupTableView che ha una singola colonna e mostra le viste che rappresentano il gruppo. Ho anche itemTableView che ha colonne che rappresentano gli elementi del gruppo. Io uso gli stessi metodi delegate/datasource con if-else-statements per verificare quale NSTableView viene utilizzato e rispondere di conseguenza con il numero corretto di righe, vista cella, ecc. Inoltre, implemento il seguente metodo delegate per regolare la tabella dei gruppi altezza della riga di vista sia uguale alla somma delle altezze di riga oggetto delle righe nel gruppo:

- (CGFloat)tableView:(NSTableView *)tableView heightOfRow:(NSInteger)row 
{ 
    if (tableView == self.groupTableView) { 
     NSUInteger firstRowIndexForGroup = ...; 
     NSUInteger lastRowIndexForGroup = ...; 
     CGFloat groupHeight = 0.0; 
     for (NSUInteger currentRowIndex = firstRowIndexForGroup; currentRowIndex <= lastRowIndexForGroup; currentRowIndex++) { 
      groupHeight += [self.itemTableView rectOfRow:lastRowIndexForGroup].size.height; 
     } 
     return groupHeight - [self.itemTableView intercellSpacing].height; 
    } else { 
     return self.itemTableView.rowHeight; 
    } 
} 

È inoltre necessario chiamare -noteHeightOfRowsWithIndexesChanged: ogni volta visualizzazione tabella richiede un raggio gruppo perché l'altezza cambia a seconda del numero di righe nel gruppo.

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row 
{ 
    if (tableView == self.groupTableView) { 
     GroupRowView *view = [tableView makeViewWithIdentifier:tableColumn.identifier owner:self]; 
     // configure view 
     [tableView noteHeightOfRowsWithIndexesChanged:[NSIndexSet indexSetWithIndex:row]]; 
     return view; 
    } else { 
     ItemRowView *view = [tableView makeViewWithIdentifier:tableColumn.identifier owner:self]; 
     // configure view 
     return view; 
    } 
} 

io selezione di riga disabili e barre di scorrimento orizzontale e verticale nella vista tabella del gruppo. Ho anche reso la griglia orizzontale solida per entrambe le visualizzazioni di tabella. Infine, posiziono la vista tabella dei gruppi direttamente accanto alla vista tabella degli articoli senza spazi intermedi, quindi appare come se fosse semplicemente un'altra colonna in una singola vista tabella. Il risultato è un'implementazione impeccabile con zero lag tra le viste della tabella. Per l'utente, appare come se fosse una singola vista tabella.

+0

Oh wow ... questa è sicuramente una soluzione che non mi colpirebbe per la prima volta! Avendo lavorato con lo scorrimento sincronizzato prima di poter vedere come funziona. Probabilmente una cosa da aggiungere è se la cella di gruppo viene cliccata/selezionata, quindi dovrebbe "inoltrare" la selezione alla prima riga della vista tabella degli articoli. – klotz

+0

Puoi anche dividere la vista tabella del gruppo fino a contenere facoltativamente due righe per gruppo, in questo modo puoi rendere la riga superiore mobile rispetto alle altre, quindi se hai un gruppo numeroso, le informazioni del tuo gruppo vengono spostate fino a quando l'ultima voce del gruppo non viene spostata schermo. – Andrew

+0

Cosa ti è venuto in mente per mantenere sincronizzate le righe della tabella degli articoli con la tabella dei gruppi? Come si mantiene la tabella degli articoli dall'ordinamento delle righe in modo che non corrispondano al gruppo a cui si trovano accanto? – erynofwales

0

si fa a non utilizzare un NSOutlineView invece? È specificamente progettato per supportare il raggruppamento.

+0

Ma come si otterrebbe il valore del gruppo in una cella con la sua altezza pari all'altezza totale di tutte le righe del nodo figlio anziché utilizzare la propria riga? – klotz

Problemi correlati