2012-10-12 19 views
28

Jaka jest rola metody registerClass:forCellWithReuseIdentifier:? Zgodnie z dokumentacją programistyczną firmy Apple ma ona na celu:UICollectionView registerClass: Metoda forCellWithReuseIdentifier łamie UICollectionView

"Zarejestruj klasę do wykorzystania w tworzeniu nowych komórek widoku kolekcji."

Kiedy próbuję go użyć, otrzymuję widok czarnej kolekcji. Kiedy go usuwam, wszystko działa poprawnie.

#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

Czy Twój widok kolekcji jest tworzony w IB? –

+0

Tak, używając storyboardu –

Odpowiedz

34

Jeśli masz już swój UICollectionView w serii ujęć, podłączeniu dataSource i delegate i dodaniu wszystkich wymaganych metod:

  • numberOfItemsInSection
  • numberOfSectionsInCollectionView (nie wymagana metoda - refer to this comment)
  • cellForItemAtIndexPath

Metoda registerClass/registerCell nie jest wymagana. Jeśli jednak chcesz ponownie wykorzystać widok, dane lub komórki, powinieneś użyć tych metod, aby system iOS mógł zapełniać swój UICollectionView w razie potrzeby. Można to również zrobić w serii ujęć poprzez ustawienie komórce prototypów (na tej samej zasadzie jak metoda registerClass.

Także jeśli szukasz dobrego wyjaśnienia na co registerCell ma i jak wykorzystać to sprawdzić this link i przejdź do dolnej części zatytułowanej

+3

Dzięki @RazorSharp. Jednak chciałbym tylko wskazać, że 'numberOfSectionsInCollectionView:' nie jest "wymaganą metodą". Zgodnie z [Dokumentacja Apple] (http://developer.apple.com/library/ios/documentation/uikit/reference/UICollectionViewDataSource_protocol/Reference/Reference.html#//apple_ref/doc/uid/TP40012175-CH1-SW5), 'Jeśli nie zastosujesz tej metody, widok kolekcji używa domyślnej wartości 1.' –

+0

@SoOverIt Dobry punkt! Zapomniałem o tym, proszę sprawdź moją edycję. –

+2

Najważniejsze jest to, że można połączyć prototypową komórkę bezpośrednio w storyboardie, który pełni tę samą rolę, co wywołanie "registerClass: ...". Wykorzystanie pamięci lub ponowne użycie komórki nie mają z tym nic wspólnego. Widok kolekcji nigdy nie ładuje komórek do pamięci, które nie są widoczne na ekranie, a jeśli identyfikator komórki nie był zarejestrowany, linia, w której zapisuje komórkę, ulegałaby awarii. – omz

4

Zgadzam się z RazorSharp's answer i chciał podkreślić, że fraza kluczowa dla mnie w Techtopia link jest „komórki i zobacz ponownego użycia.”:

Jeśli klasa komórka został napisany w kodzie, rejestr n jest wykonywane przy użyciu metody registerClass: UICollectionView, w przeciwnym razie użyj registerNib