2013-02-11 12 views
5

Mi piacerebbe che il mio view-based-NSTableview non riutilizzi TableCellViews generate in precedenza che sono fuori dallo scope. Immagino che ciò sarebbe possibile con UITableView sovrascrivendo dequeueReusableCellWithIdentifier: restituire nil. C'è una soluzione simile per NSTableView?Come rendere NSTableView non riutilizza TableCellViews

-

mio background: ho un bel complesso a base di visione-tableView legati alla ManagedObjects nel solito modo (cioè tabella di contenuti, -Selezione e -sortdescriptor sono legati a un arraycontroller ei tableCellView elementi associare all'oggetto Value).

La tabella ha circa 20 colonne ma al massimo 400 righe. Lo scrolling è molto lento, ma il time-profiling indica che non esiste un'unica fonte di lentezza (il più grande singolo metodo-la chiamata richiede circa il 5% del tempo). Dopo aver memorizzato nella cache le proprietà derivate/personalizzate del mio ManagedObject senza un notevole incremento delle prestazioni, sto cercando di memorizzare nella cache le visualizzazioni (per evitare il rebind frequente delle tablecellViews quando una vista entra in ambito).

Quello che sto cercando al momento è di non legare il contenuto della tabella, ma di ottenere le mie viste usando il protocollo NSDatasource. Lì, nel

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

Vorrei tornare TableCellViews cache se esistono. In caso contrario, crea un nuovo uno via

[self.table makeViewWithIdentifier:... owner:self]; 

Dal makeViewWithIdentifier può restituire una vista che sono già memorizzati nella cache da me, il tavolo-contenuto viene incasinato con le cellule sbagliate.

performance è significativamente migliore di questo approccio ...

-

Altre idee su come rendere più performante scrolling sono anche appriciated.

+0

Sarei interessato a sapere se si è da qualche parte con questo. Penso di avere il problema opposto in quanto il mio NSTableView è * non * riutilizzando le celle per qualche motivo. Ho provato PXListView, ma questo ha avuto prestazioni peggiori e un sacco di bug, quindi mi piacerebbe rimanere con NSTableView ma capire come renderli le viste cache che penso che dovrebbe fare. Per quanto riguarda il tuo problema, potresti creare un identificativo univoco per ciascuna vista o che causerà un terribile utilizzo della memoria? – danpalmer

risposta

7

Nella tabellaView: viewForTableColumn: implementazione impostato su .identifier sulla visualizzazione restituita su nil. Ciò impedirà al tavolo di memorizzarlo nella cache. Potresti quindi gestire la tua cache. FWIW, non devi nemmeno usare makeViewWithIdentifier: affatto; puoi semplicemente creare manualmente le tue visualizzazioni da zero, invece di usare quel metodo (che carica le visualizzazioni pre-setup del NIB).

Tuttavia, se si verificano problemi di prestazioni, sarebbe meglio indirizzare quelli guardando a ciò che è lento e perché. Non hai fornito informazioni sul perché è lento, quindi è difficile dire cosa fare. 20 colonne sono molte. È possibile ottenere prestazioni migliori tentando di ridurre il numero di layer utilizzando canDrawSubviewsIntoLayer, NSTableCellView o NSTableRowView. Ma ci sono molti avvertimenti e cose da sapere quando si fa questo.

corbin

+0

Inoltre, proprio come in UIKit e dequeueReusableCellWithIdentifier:, è possibile sovrascrivere makeViewWithIdentifier e implementare il proprio meccanismo di memorizzazione nella cache (o restituire nil). –

+0

Stai dicendo che il ritorno da tableView: viewForTableColumn: è usato solo per il caching del pool di riutilizzo?C'è qualche informazione corrente su quante viste sarebbe egregiamente lenta o un modo per sapere quanto è grande il pool di riutilizzo? Qual è il modo per sapere in che modo ciò potrebbe legarsi alla vista di scorrimento e sovrascrivere l'API? – uchuugaka

+1

No, non è quello che ho detto. Il ritorno da tableView: viewForTableColumn: è la stessa vista che la tabella colloca in quella determinata posizione. Quando la tabella va a rimuovere la vista (perché non è più necessaria), viene memorizzata SOLO nella cache se view.identifier è diverso da zero. Altrimenti, la vista viene sballottata e liberata. –