2012-09-29 61 views
5

Estoy tratando de configurar UICollectionViewprogramatically en mi controlador de vista que se extiende UIViewController. Por alguna razón, mi vista de colección no se muestra en absoluto. Debajo está lo que tengo.UICollectionView no aparece

¿Por qué no está apareciendo? Lo conecto al delegado y a la fuente de datos y lo agrego como una subvista al self.view. ¿Qué falta en mi código?

En mi archivo .h:

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

En mi archivo .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); 
} 

Respuesta

3

Recibí errores al intentar ejecutar tu código a menos que cambiara el método loadView a viewDidLoad, de acuerdo con los documentos que no se supone que debes llamar directamente a loadView. Para obtener los métodos de origen de datos y delegar a correr, me moví las líneas de ajuste de la fuente de datos y delegado a la libre debajo de donde se establece self.collectionView = CollectionView

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

Eso no funcionó. Terminé subclasando 'UICollectionViewController' y cambiando el método' init' por el que se ajusta a 'UICollectionViewController' y funcionó. Tengo problemas con 'cellForIndexPath'; publicaré una nueva publicación para eso. – darksky

+0

No sé por qué no hubiera funcionado para usted: acabo de hacer una nueva aplicación, ingresé su código e hice los 2 cambios que mencioné, y funcionó bien. – rdelmar

+0

Eso es extraño. ¿Eres capaz de mostrar elementos también? Estoy teniendo problemas con mi 'cellForItemInIndexPath'. Me está dando un error de 'no se pudo descifrar'. ¿No estás usando xib/storyboard en absoluto? – darksky

0

Sus rendimientos numberOfSectionsInCollectionView:0. Para una vista de colección con una sección, debe devolver 1 o simplemente no implementar este método.

Además, no puedo ver dónde aloc/init self.collectionView.

+0

Acabo de cambiar la sección de regreso a 0. Por favor, consulte la actualización anterior. Agregué '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' y ahora todo lo que obtengo es una pantalla negra vacía. Cuando cambié el fondo de collectionView, la pantalla cambia su color y sé que se muestra la vista de colección. No está invocando ninguna fuente de datos o métodos delegados, por lo que los datos nunca se agregan. – darksky

+0

@Darksky: Intente mover la configuración de 'loadView' a' viewDidLoad'. No puedo probarlo ahora mismo, pero ese es el lugar habitual para configurar elementos personalizados de una vista. –

0

Terminé la subclasificación UICollectionViewController en lugar de UIViewController y cambiar el método init para:

- (id)initWithCollectionViewLayout:(UICollectionViewLayout *)layout

y funcionó.

0

Solo debe vincular su delegado CollectionView y dataSource a ViewController en StoryBoard. enter image description here

+0

Describe programáticamente cómo hacer esto. –