2013-02-25 22 views
20

Biorąc pierwszy zanurzyć z widokiem zbiórki i używam do tego błędu:błąd nie mógł dequeue widok rodzaju UICollectionElementKindCell

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'could not dequeue a view of kind: UICollectionElementKindCell with identifier Cell - must register a nib or a class for the identifier or connect a prototype cell in a storyboard'

Kod jest bardzo prosty, jak pokazano poniżej. Nie mogę do końca życia zrozumieć, czego mi brakuje.

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

Kolekcja widok kontroler został stworzony za pomocą stalówki i delegatów & datasources są ustawione na właściciela pliku.

Zobacz plik nagłówka sterownika również jest naprawdę podstawowy.

@interface NewMobialViewController_3 : UICollectionViewController <UICollectionViewDataSource, UICollectionViewDelegateFlowLayout> 
@end 
+11

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

Odpowiedz

28

Z UICollectionView documentation dla metody rozkolejkowania:

Important: You must register a class or nib file using the registerClass:forCellWithReuseIdentifier: or registerNib:forCellWithReuseIdentifier: method before calling this method.

+0

co powinienem zrobić, jeśli używam defibrylatora UICollectionViewCell, który nie jest niestandardowy? – Mani

+0

Użytkownik rejestruje klasę bazową zamiast niestandardowej. Ale prawie zawsze chcesz mieć podklasę. Domyślna komórka nie zawiera niczego. – jrturton

+0

Tak, mam to dzięki @jrturton – Mani

6

Uzupełniając co @jrtuton napisane ... Co potrzebne jest:

1) Zarejestruj stalówka plik "connect" go z Twoim identyfikatorem:

//MyCollectionView.m 
- (void) awakeFromNib{ 
[self registerNib:[UINib nibWithNibName:@"NibFileName" bundle:nil] forCellWithReuseIdentifier: @"MyCellIdentifier"]; 
} 

2) Użyj swojego identyfikatora, aby załadować niestandardową komórkę ze stalówką:

//MyCollectionView.m 
- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath { 
    MyCustomCollectionViewCell* cell = [cv dequeueReusableCellWithReuseIdentifier:@"MyCellIdentifier" forIndexPath:indexPath]; 
} 

3) Zastosowanie zawsze NSString statycznych * ponownie uniknąć tych samych identyfikatorów w swojej aplikacji.

21

Musisz użyć tego samego identyfikatora między argumentem dequeueReusableCellWithReithIdentifier a właściwością UICollectionViewCell.

UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"CollectionViewCell" forIndexPath:indexPath]; 

identifier

+0

Dziękuję !!!!!! –

+0

Jak zarejestrować identyfikator dla UITableViewCell dodano UICollectionView? – kiran

1

wiem, że to jest stary, ale już doświadczony ten sam problem i chciał podzielić się naprawić go dla mnie.

W moim przypadku, mam ogłosił globalny identyfikator

let identifier = "CollectionViewCell" 

i musiałem użyć siebie tuż przed użyciem go:

collectionView.dequeueReusableCellWithReuseIdentifier(self.identifier, forIndexPath: indexPath) as! CollectionViewCell 

Nadzieja to pomaga ktoś :)

-1

Jeśli utworzysz go za pomocą kodu, musisz utworzyć niestandardową UICollectionViewCell, a następnie zainicjować UICollectionView i użyj loadView, aby ustawić widok, który utworzysz jako UICollectionView. Jeśli utworzysz w viewDidload(), to nie działa. Ponadto można również przeciągnąć UICollectionViewController, oszczędza to dużo czasu.

0

Musisz podać poprawny identyfikator ponownego wykorzystania w storyboardie, który podałeś w kodzie podczas rejestracji collectionViewCell.

Oto kod.

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ClctnVC", for: indexPath)as! ClctnVC 
    return cell    
} 
Powiązane problemy