2012-12-07 2 views
10

Sto cercando un modo per creare sezioni simili a iOS in NSTableView (come in iTunes 11 - Allegati).Vista basata su NSTableView con sezioni

Come si può vedere nello screenshot, "Album" è una sezione e "Songs" è il secondo. Qualsiasi aiuto sarebbe apprezzato.

Grazie!

enter image description here

+0

Prova questo: sotto le tabelle complesse tableviews https://developer.apple.com/library/mac/samplecode/TableViewPlayground/Introduction/Intro.html – johndpope

risposta

1

Se volete sezioni si deve fondamentalmente per rotolare il proprio (riconoscere che fila x si suppone sia una cella della sezione e fornire una vista di sezione. TwUI ha TUITableView che permette questo (e massicciamente migliora prestazioni di scorrimento, nella mia esperienza)

+0

"riconosce che la riga x deve essere una cella di sezione e fornire una sezione vista "è esattamente ciò di cui avevo bisogno per andare avanti. Ho provato a utilizzare TwUI in precedenza, ma mi sono imbattuto in alcuni bug di crash con esso. – user754905

+0

Ci sono altre soluzioni oltre a TwUI disponibili, ma ho trovato TwUI di gran lunga il più fluido. – Max

+0

Ho aggiornato TWUI per consentire intestazioni appiccicose - ma ci sono contro con questa libreria (in particolare non è possibile aggiungere sottoview di nsview). https://github.com/johndpope/osx-stickyheaders – johndpope

19

vedo questo è una vecchia questione, ma la risposta è quella di utilizzare una vista basata NSTableView quindi implementare tableView:. viewForTableColumn: fila :.

questo è il codice basato su come Lo faccio. Non è stato compilato in Xcode.

-(NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { 
    NSTableCellView *cell = nil; 
     // get your row from your array of objects. 
     // determine if it's a section heading or not. 

    SomeClass *someObject = [self.myObjects objectAtIndex:row]; 

    if (someObject.isSectionHeading) { 
     cell = [tableView makeViewWithIdentifier:@"HeaderCell" owner:self]; 
     cell.textField.objectValue = someObject.headingName; 
    } else { 
     cell = [tableView makeViewWithIdentifier:@"DataCell" owner:self]; 
     cell.textField.objectValue = someObject.rowValue; 
    } 

    return cell; 

} 

E anche tableView: isGroupRow metterà uno sfondo grigio sui vostri titoli delle sezioni

-(BOOL)tableView:(NSTableView *)tableView isGroupRow:(NSInteger)row { 
    BOOL isGroup = NO; 
    // Choose some way to set isGroup to YES or NO depending on your records. 
    return isGroup; 
} 

Assicurarsi in Interface Builder aver impostato gli identificatori per le NSTableCellViews a "HeaderCell" e "DataCell". O usa i nomi che vuoi. Finché corrisponde al tuo codice. Puoi avere quante di queste cellule vuoi.

Se si crea una sottoclasse di NSTableCellView, è possibile aggiungere facilmente campi di testo, caselle di controllo, immagini, ecc. Alla vista e impostare i relativi valori di conseguenza.

+2

Posso aggiungere che puoi anche fornire l'altezza della cella in modo diverso tra le celle di contenuto e le celle di sezione implementando il metodo 'tableView: heightOfRow:'. Per la cella della sezione, puoi usare l'altezza di default come questa: '[tableview rowHeight]' e per la cella di contenuto puoi usare la tua, come 70.0. – HuaTham

+0

Per quanto ne so - questa tecnica in realtà non attacca la vista dell'header in cima alla vista come fa l'iphone. Sono stato in grado di creare questo effetto solo usando TWUI github.com/johndpope/osx-stickyheaders – johndpope

+0

@johndpope Controlla la proprietà su NSTableView chiamata 'floatsGroupRows' –

2

Esiste un tutorial molto buono e semplice che mostra come implementare uno NSTableView con sezioni con codice di esempio su github. Basta guardarlo here e nella descrizione del video c'è un link per scaricare il codice.