2013-04-11 5 views
6

Voglio davvero fornire celle "statiche" al mio UICollectionView, ai vecchi tempi con UITableView. Ma so che noi bravi ragazzi e ragazze dobbiamo usare dequeueReusableCellWithReuseIdentifier:forIndexPath: come fabbrica per le nostre cellule. Quindi propongo il seguente schema e chiedo feedback sul suo potenziale. Finora, sta funzionando per me, ma temo un trucchetto sconosciuto.Devo chiamare il dequeueCell di UICollectionView: all'interno di cellForPath:?

#import "MyCellClass.h" 

@implementation MyViewController { 
    MyCellClass *_cell0; // etc - many are possible. could store in array 
} 

-(void)viewDidLoad { 
    // assume MyCellClass has a +nib and +reuseId. The reader understands. 
    [_collectionView registerNib:[MyCellClass nib] forCellWithReuseIdentifier:[MyCellClass reuseId]]; 
} 

-(void)viewDidAppear:animated { 
    // this is where the fun begins. assume proper counts coming from the datasource 
    NSIndexPath *indexPath = [NSIndexPath indexPathWithRow:0 inSection:0]; 
    _cell0 = [[self collectionView] dequeueReusableCellWithReuseIdentifier:[MyCellClass reuseId] forIndexPath:indexPath]; 
    // etc 
} 

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { 
    if ([indexPath row] == 0) return _cell0; 
    // etc 
} 

Rifletti deliberatamente su dettagli come la configurazione della cella. Follia? Genio? Solo lo status quo? Sembra che funzioni fino ad ora, ma temo che, in qualche modo, Apple si aspetta che lo dequeue venga chiamato da cellForPath. qualche idea?

+2

Penso che la vera risposta sia "non sei obbligato a farlo!" :) – Fattie

risposta

3

risposta da Apple TSI Guy:

Anche se lei ha detto il funzionamento dell'app, è in realtà dovrebbe usare "dequeueReusableCellWithReuseIdentifier" all'interno della sorgente di dati metodo "cellForItemAtIndexPath". Questo è il modello di utilizzo supportato. Non tentare di trattenere MyCellClass, lasciare che la vista raccolta gestisca e ti chiederà di deselezionarla se necessario.

Ho intenzione di fare il broncio un po ', modificare il mio codice e quindi emettere una richiesta di miglioramento. Ma ti dico che ha funzionato bene!

3

L'unico motivo per chiamare dequeueReusableCellWithReuseIdentifier:forIndexPath: è riutilizzare le celle. Ma una vista collezione "statica"? Di quante cellule stiamo parlando? Se avessi una vista di raccolta abbastanza piccola da non scorrere mai, non prenderei la briga di riutilizzare le celle. Quel risolverebbe sicuramente il problema in modo preciso. Dopo tutto, una tabella statica dallo storyboard non sta riutilizzando le celle; questo è ciò che lo rende statico. Quindi, direi, rilasciare le cose su dequeueReusableCellWithReuseIdentifier:forIndexPath del tutto e solo fornire celle quando richiesto.

Non c'è nulla di magico in dequeue; è solo un modo per scoprire se ci sono delle celle nella pila di riutilizzo e ottenerne una in questo caso. Dopo tutto, considera come funzionavano le viste delle tabelle, per esempio, su iOS 4. Hai detto dequeue, ma se non ci fossero celle riutilizzabili da restituire, la tabella restituiva nil e dovevi inserire alloc-init nella tua cella o estrarla da un pennino, stesso. Bene, stai proponendo di farlo per tutti gli articoli nella visualizzazione insieme. Vai avanti.

+0

Sono d'accordo: stiamo parlando di 6 celle, grandi, 4 in una pagina (scroll orizzontale). Per questo. Prevedo cambiamenti in futuro. Al momento è un po 'confuso. Sono d'accordo con te in linea di principio, ma i dettagli della situazione richiedono qualcosa del genere. – QED

+0

Per quanto riguarda la fornitura di celle, ho pensato che * fosse * necessario * per rimuoverle. Posso allocare/init/loadNib? Preferirei farlo comunque, in questo caso. – QED

+0

Assolutamente. Come ho detto nella mia risposta, l'unica ragione per la rimozione della coda è quella di toglierli da una pila di riutilizzo. Se non stai riutilizzando, non hai bisogno di farlo. E poiché li stai dequando tutti davanti, non li stai già riutilizzando. – matt

0

Controlla il mio MBStaticCollectionView, consente di definire celle UICollectionView statiche da Interface Builder senza la necessità di definire un'origine dati.

Problemi correlati