2013-04-18 15 views
13

Come suggerisce il titolo, ho un UICollectionView collegato ad un UIViewController tramite IB. Ho una sottoclasse UICollectionView chiamata imageCell. Nel metodo viewcontroller viewDidLoad, io registro di classe in questo modo:UICollectionViewCells non visualizzato in UICollectionView

CGRect collectionViewRect = CGRectMake(384, 60, 728, 924); 
UICollectionViewFlowLayout *flow = [[UICollectionViewFlowLayout alloc] init]; 
imageCollectionView = [[UICollectionView alloc] initWithFrame:collectionViewRect collectionViewLayout:flow]; 
[imageCollectionView registerClass:[imageCell class] forCellWithReuseIdentifier:@"Cell"]; 
imageCollectionView.delegate = self; 
imageCollectionView.dataSource = self; 

Ho poi chiamo un metodo chiamato getPhotos a viewDidAppear (per ragioni di interfaccia utente) che ottiene foto da un servizio e poi chiamo [imagCcollectionView reloadData]; all'interno getPhotos.

Poi nel cellForItemAtIndexPath faccio la seguente:

imageCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath]; 
GRKAlbum *album = [albums objectAtIndex:indexPath.item]; 
cell.titleLabel.text = album.name; 
return cell; 

So che non sto facendo niente di male qui perché il metodo viene chiamato e cell non è nil e nessuno dei due è album.

Quindi, quando eseguo tutto questo codice, viene visualizzato UICollectionView, ma non contiene nulla. Tutto quello che posso vedere è il colore di sfondo dello collectionView. Qualsiasi aiuto sarebbe molto apprezzato.

Nota: NON ho creato un XIB per la classe imageCell quando l'ho creato e sto usando Storyboard.

risposta

71

Esistono alcuni modi per eseguire il debug di questa situazione.

  1. Registrati UICollectionViewCell classe al posto del tuo customCell e impostare il colore di sfondo della cella in cellForItem...

  2. Se le cellule stanno comparendo in passo uno tenta di utilizzare la propria classe di cellule e impostare lo sfondo

Stai usando lo storyboard? then ..

Non è necessario registrare alcuna cella per la vista raccolta. È possibile utilizzare la cella prototipo, è sufficiente fornire l'id corretto per la cella. È possibile progettare tutto nella cella del prototipo. La classe personalizzata potrebbe non essere necessaria in tutti i casi.

+0

Questo non ha funzionato ... – virindh

+0

Vedere la mia modifica .... –

+9

grazie mille .. è una soluzione molto utile. ho appena rimosso [self.collectionView registerClass: [classe cutomCollectionCell] forCellWithReuseIdentifier: @ "cutomCollectionCell"]; e wow, sta funzionando bene. –

40

Se è stata creata la cella nello storyboard, è sufficiente rimuovere l'istruzione della classe di registro. Non è necessario registrare nulla (per una vista raccolta o visualizzazione tabella) se si crea la cella in uno storyboard (infatti, se si agisce in tal modo, si verificano dei problemi). L'unica cosa che devi fare è assicurarti di aver impostato l'identificatore in IB.

+3

Risposta aiutata :) –

+0

RegisterClass: mi ha fregato comunque. :(:) –

+0

Questo lo ha risolto per me. Qualcuno abbastanza esperto da sapere perché non solo non funziona così, ma lo rovina completamente? – micnguyen

0

Si sta creando un'istanza di una nuova vista raccolta nel codice, ma non si aggiunge la visualizzazione allo schermo. Dici che stai già usando gli storyboard, suppongo che ciò che puoi vedere sia la vista della raccolta dal tuo storyboard, che presumibilmente non è collegata a un'origine dati o un delegato? O quello o non stai chiamando ricaricare sulla giusta vista di raccolta.

Configurare la vista raccolta nello storyboard (e impostarne uno sbocco per tutto ciò che deve essere fatto nel codice) o configurarlo completamente in codice. Al momento penso che tu abbia due viste di raccolta.

0

L'ho realizzato utilizzando lo storyboard Xcode 6.2.Speranza che aiuta

#import <UIKit/UIKit.h> 

@interface InfoSecurity : UIViewController 
@property (strong, nonatomic) IBOutlet UICollectionView *tabsCV; 

@end 

.m 
************** 

#import "InfoSecurity.h" 
#import "TabsCell.h" 

@interface InfoSecurity()<UICollectionViewDataSource,UICollectionViewDelegateFlowLayout> 

@end 

@implementation InfoSecurity 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 

    [self.tabsCV registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"TabsCell"]; 

} 

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section 
{ 
    return 03; 
} 
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView 
{ 
    return 01; 
} 
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return CGSizeMake(90, 50); 
} 
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSString *reuseIdentifier = @"tabscellID"; 


    TabsCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath]; 

    cell.TabTitleLabel.text= @"OPTIONS"; 

    return cell; 

} 
- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 
+0

L'ho realizzato usando lo storyboard Xcode 6.2. Spero che aiuti ... – alvin

15

Ho avuto lo stesso problema risolto con la sostituzione convenzionale linea registercell con la riga in basso

[self.collection registerNib:[UINib nibWithNibName:@"nibname" bundle:nil] forCellWithReuseIdentifier:identifier]; 
+1

Questo mi ha aiutato! Se hai un XIB per la tua cella, usa questo metodo. Stavo usando il completamento automatico e sono atterrato usando registerClass: forCellWithReuseId: e questo ha causato il non caricamento delle mie viste e quindi non sono stato visualizzato. – RPM

0

mi sentivo come un manichino quando ho capito le mie cellule vista di raccolta sono state soddisfatte dalla mia navigazione bar. Quindi, assicurati che la barra di navigazione (se ne possiedi una) non copra le celle della vista di raccolta con cui stai provando.

0

A volte la cella della vista di raccolta è nera (lo stesso colore con sfondo, invisibile, nascosto è no), ricaricare le celle visibili è un aggiramento.

Problemi correlati