2012-10-12 190 views
28

¿Cuál es el rol del método registerClass:forCellWithReuseIdentifier:? De acuerdo con la documentación de desarrolladores de Apple que se supone queUICollectionView método registerClass: forCellWithReuseIdentifier rompe UICollectionView

"Registrar una clase para su uso en la creación de nuevas células de la vista de colección."

Cuando intento usarlo, obtengo una vista de colección negra. Cuando lo borro todo funciona bien.

#define cellId @"cellId" 
#import "ViewController.h" 
#import "Cell.h" 
@interface ViewController() 
@property (weak, nonatomic) IBOutlet UICollectionView *collectionView; 
@property(strong, nonatomic)NSMutableArray * photoArray; 


@end 

@implementation ViewController 


- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
    NSLog(@"%@",_photoArray); 
    _photoArray = [[NSMutableArray alloc]initWithCapacity:0]; 
    [_collectionView registerClass:[Cell class] forCellWithReuseIdentifier:cellId]; 
    for(int i=1;i<=12;i++) 
    { 
     NSString * imgName = [NSString stringWithFormat:@"%d.png",i]; 
     UIImage *img = [UIImage imageNamed:imgName]; 
     [_photoArray addObject:img]; 
    } 
} 


- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{ 
    return _photoArray.count; 
} 

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

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{ 

    Cell* cell = [_collectionView dequeueReusableCellWithReuseIdentifier:cellId forIndexPath:indexPath]; 
    cell.cellImage.image = [_photoArray objectAtIndex:indexPath.row]; 
    return cell; 
} 
+0

¿Se está creando su vista de colección en IB? –

+0

Sí, usando el guión gráfico –

Respuesta

34

Si ya ha creado su UICollectionView en Storyboard, conectado su dataSource y delegate, y que haya agregado todos los métodos necesarios:

  • numberOfItemsInSection
  • numberOfSectionsInCollectionView (no es una método requerido - refer to this comment)
  • cellForItemAtIndexPath

Entonces el método registerClass/registerCell no es necesario. Sin embargo, si necesita reutilizar una vista, datos o celdas, debe usar esos métodos para que iOS pueda completar su UICollectionView según sea necesario. Esto también se puede hacer de su guión gráfico mediante el establecimiento de la Célula Prototipo (el mismo principio que el método registerClass.

Además, si usted está buscando una buena explicación de lo que registerCell hace y cómo lo utilizan echa un vistazo this link y vaya a la sección inferior titulado

+3

Gracias @RazorSharp. Sin embargo, me gustaría señalar que 'numberOfSectionsInCollectionView:' no es un 'método requerido'. Según [Apple Documentation] (http://developer.apple.com/library/ios/documentation/uikit/reference/UICollectionViewDataSource_protocol/Reference/Reference.html#//apple_ref/doc/uid/TP40012175-CH1-SW5), 'Si no implementa este método, la vista de colección usa un valor predeterminado de 1.' –

+0

@SoOverIt ¡Buen punto! Lo había olvidado, echa un vistazo a mi edición. –

+2

El punto principal es que puede conectar un prototipo de celda directamente en un guión gráfico, que cumple el mismo rol que llamar 'registerClass: ...'. El uso de la memoria o la reutilización de la celda realmente no tienen nada que ver con esto. Una vista de colección nunca carga celdas en la memoria que no están en la pantalla, y si el identificador de la celda no estaba realmente registrado, la línea donde dequeue una celda se bloqueará. – omz

4

de acuerdo con RazorSharp's answer y quería señalar que esa frase clave para mí en el Techtopia link es "celular y Ver reutilización.":

Si la clase de células fue escrito en el código, el registro n se realiza utilizando el método registerClass: de UICollectionView; de lo contrario, use registerNib

Cuestiones relacionadas