2012-09-29 2 views
5

Sto cercando di impostare UICollectionViewprogrammaticamente nel controller di visualizzazione che estende UIViewController. Per qualche motivo, la mia vista raccolta non viene visualizzata affatto. Di seguito è quello che ho.UICollectionView Not Appearing

Perché non appare? Lo sto collegando al delegato e all'origine dati e aggiungendolo come sottoview a self.view. Cosa manca nel mio codice?

Nel mio file .h:

@interface MainViewController : UIViewController 
{ 
    @private 
    UICollectionView *_collectionView; 
    NSMutableArray *_results; // data source array 
} 
@end 

Nel mio file .m:

@interface MainViewController() <UICollectionViewDataSource, UICollectionViewDelegateFlowLayout> 
@property (nonatomic, retain) UICollectionView *collectionView; 
@property (nonatomic, retain) NSMutableArray *results; 
@end 

@implementation MainViewController 

@synthesize collectionView = _collectionView; 
@synthesize results = _results; 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     // some init stuff - nothing to do with collection view. 
    } 

    return self; 
} 

- (void)loadView 
{ 
    self.results = [NSMutableArray array]; 
    UIImage *image1 = [UIImage imageNamed:@"img1.jpg"]; 
    UIImage *image2 = [UIImage imageNamed:@"img2.jpg"]; 
    [self.results addObject:image1]; 
    [self.results addObject:image2]; 

    self.collectionView.dataSource = self; 
    self.collectionView.delegate = self; 

    UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc] init]; 

    UICollectionView *collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height) collectionViewLayout:flowLayout]; 
    self.collectionView = collectionView; 

    [self.view addSubview:self.collectionView]; 

    [self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"Cell"]; 
    [self.collectionView reloadData]; 

} 

- (NSInteger)collectionView:(UICollectionView *)view numberOfItemsInSection:(NSInteger)section 
{ 
    return [self.results count]; 
} 

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

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath]; 
    cell.backgroundColor = [UIColor colorWithPatternImage:[self.results objectAtIndex:indexPath.row]]; 
    return cell; 
} 


- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { 
    UIImage *image = [self.results objectAtIndex:indexPath.row];  
    return CGSizeMake(image.size.width, image.size.height); 
} 

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

risposta

3

Ho ricevuto degli errori nel tentativo di eseguire il codice, a meno che non abbia modificato il metodo loadView in viewDidLoad, in base ai documenti che non dovresti chiamare direttamente loadView. Per ottenere i metodi di origini dati e delegato a correre, ho spostato le linee di impostazione della sorgente delegato e dei dati di auto sotto dove si imposta self.collectionView = CollectionView

self.collectionView = collectionView; 
    self.collectionView.dataSource = self; 
    self.collectionView.delegate = self; 
+0

Questo non ha funzionato. Ho finito con la sottoclasse di 'UICollectionViewController' e cambiando il metodo' init' in quello che è conforme a 'UICollectionViewController' e ha funzionato. Sto riscontrando problemi con 'cellForIndexPath' - pubblicherò un nuovo post per questo. – darksky

+0

Non so perché non avrebbe funzionato per te: ho appena creato una nuova app, inserito il tuo codice e ho apportato le 2 modifiche che ho menzionato, e ha funzionato bene. – rdelmar

+0

È strano. Sei in grado di visualizzare anche gli oggetti? Sto riscontrando problemi con il mio 'cellForItemInIndexPath'. Mi sta dando un errore 'could not dequeue'. Non stai usando anche xib/storyboard? – darksky

0

vostri numberOfSectionsInCollectionView: rendimenti 0. Per una vista di raccolta con una sezione, è necessario restituire 1 o semplicemente non implementare questo metodo.

Inoltre, non riesco a vedere dove si assegna/init self.collectionView.

+0

Ho appena modificato la sezione ritorno a 0. Vedi aggiornamento sopra. Ho aggiunto 'UICollectionView * collectionView = [[UICollectionView alloc] initWithFrame: CGRectMake (0, 0, self.view.frame.size.width, self.view.frame.size.height) collectionViewLayout: flowLayout]; self.collectionView = collectionView; 'to' loadView' e ora tutto ciò che ottengo è una schermata nera vuota. Quando ho cambiato lo sfondo della collectionView, lo schermo cambia colore e so che la vista della collezione è visibile. Non sta invocando alcuna fonte di dati o metodi delegati, quindi i dati non vengono mai aggiunti. – darksky

+0

@Darksky: prova a spostare la configurazione da 'loadView' a' viewDidLoad'. Non posso testarlo da solo in questo momento, ma questo è il solito posto per la configurazione di elementi personalizzati di una vista. –

0

ho finito per sottoclasse UICollectionViewController invece di UIViewController e cambiando il metodo init a:

- (id)initWithCollectionViewLayout:(UICollectionViewLayout *)layout

e ha funzionato.

0

È necessario associare il proprio destinatario CollectionView e dataSource a ViewController nello StoryBoard. enter image description here

+0

Descrivere programmaticamente come eseguire questa operazione. –