2012-11-04 10 views
9

Ho appena iniziato a giocare con UICollectionView per la prima volta. Sembra funzionare bene, ma avendo un problema e una domanda al riguardo.UICollectionView registerCell - Blank Cells

ho la mia messa a punto UICollectionView come qui sotto e con una cella personalizzato:

- (NSInteger)collectionView:(UICollectionView *)view numberOfItemsInSection:(NSInteger)section 
{ 
    return 10; 
} 

- (NSInteger)numberOfSectionsInCollectionView: (UICollectionView *)collectionView 
{ 
    return 1; 
} 

- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    ContactCell *cell = [cv dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath]; 
    cell.nameLbl.text = @"text"; 

    return cell; 
} 

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return CGSizeMake(145, 95); 
} 

- (UIEdgeInsets)collectionView: 
(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section 
{ 
    return UIEdgeInsetsMake(10, 10, 10, 10); 
} 

Quindi questo è tutto dandy, ma ho aggiunto questa linea a viewDidLoad:

[collectionView registerClass:[ContactCell class] forCellWithReuseIdentifier:@"Cell"]; 

questo sta causando problemi e non capisco perché. Quando abilito questa linea, tutte le mie celle diventano vuote. Come mai? Cosa mi manca?

Inoltre, a quanto ho capito, se quella linea abilita le celle riutilizzabili, perché devo fare con una vista insieme o non doverla vista tabella?

Qualsiasi aiuto tecnico o esplicativo apprezzato, , grazie.

+0

come stai impostando la vista per la cella? programmaticamente nella sottoclasse? – jackslash

+0

L'ho impostato nel mio Storyboard. Ho un UICollectionView con una singola cella, quella cella ha il suo identificatore, la classe personalizzata collegata e l'etichetta in essa. –

risposta

24

Lo storyboard registra automaticamente la cella progettata nello storyboard per l'identificatore di riutilizzo specificato per tale cella nel riquadro a destra nel generatore di interfacce. Registrando nuovamente la classe per quell'identificatore di riutilizzo, la vista raccolta chiama semplicemente alloc init sulla sottoclasse e si aspetta che la vista venga impostata a livello di programmazione.

Da the documentation:

Se in precedenza registrato un file di classe o di punta con la stessa riutilizzo identificativo, la classe si specifica nel parametro cellClass sostituisce la vecchia voce. È possibile specificare nil per cellClass se si desidera che annulli la registrazione della classe dall'identificatore di riutilizzo specificato.

Se si vuole progettare cellule al di fuori dello storyboard è possibile sia l'installazione l'interfaccia di programmazione o impostare una cella in una XI ter separata e quindi chiamare

- (void)registerNib:(UINib *)nib forCellWithReuseIdentifier:(NSString *)identifier

Dove il mosto pennino avere una vista di livello superiore che è una cella della sottoclasse personalizzata con l'identificatore di riutilizzo corretto impostato nel builder dell'interfaccia.

+0

Così dicendo che posso solo disegnare visivamente la mia cella da uno xib e usare il metodo che suggerisci, altrimenti devo crearlo a livello di programmazione? –

+1

oppure puoi progettarli nello storyboard aggiungendo celle prototipo alla vista raccolta. la story board registra automaticamente la cella per te e il riutilizzo è attivato. – jackslash

+0

ecco perché diventa vuoto quando chiami 'registerClass:', stai disattivando le cose che hai fatto nello storyboard. È anche per questo che funziona senza la linea.Le viste di raccolta non funzionano senza una sorta di cella riutilizzabile specificata – jackslash

0

Rimuovere

[self.collectionview registerClass:[NewCell class] forCellWithReuseIdentifier:@"Cell"]; 

Per storyboard non abbiamo bisogno di questa linea

+0

Sì, è la risposta √ –