2012-10-28 22 views
21

Jestem nowy w i podążam za tutorialem znalezionym w Internecie, ale utknąłem na błędzie, którego nie mogę wymyślić. Oto trochę kontekstu.UICollectionView musi zostać zainicjowany z niezerowym parametrem układu

W debugera można zobaczyć, że po dzieje:

  • numberOfSectionsInCollectionView: nazywa się i zwraca 1
  • collectionView:numberOfItemsInSection: nazywa się i powrotu do wielkości modelu (20)
  • collectionView:layout:sizeForItemAtIndexPath: jest wywoływana raz dla każdego elementu w modelu
  • collectionView:layout:insetForSectionAtIndex: nazywa
  • collectionView:cellForItemAtIndexPath: g ETS zadzwonił i zawiesi na tej linii ...

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

z tego błędu ...

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'UICollectionView must be initialized with a non-nil layout parameter' 

Kiedy wstrzymać wykonanie na tej linii i sprawdź konsoli wydaje się, że jest układ ...

(lldb) po collectionView.collectionViewLayout 
(UICollectionViewLayout *) $4 = 0x07180fd0 <UICollectionViewFlowLayout: 0x7180fd0> 

UICollectionView jest częścią jedynej sceny w serii ujęć. W viewController.m nie ma żadnych innych utworzonych przez siebie postaci.

Czy ktoś ma jakieś pomysły?

+2

Błąd ten pojawia się, gdy tworzenia nowego widoku kolekcji za pomocą alokacji/init lub nowy , zamiast dodawać obiekt układu podczas inicjowania. Czy tworzysz nowy widok kolekcji? – jrturton

+1

@jrturton Nie, że wiem. UICollectionView jest częścią jedynej sceny w scenorysie. W viewController.m nie ma żadnych UICollectionViews utworzonych w jakikolwiek sposób. Ale dzięki temu i będąc nowym dla widoków kolekcji, nie jestem pewien, gdzie układ jest powiązany z widokiem kolekcji. –

Odpowiedz

18

Jak się okazało, problem polegał na registerClass:. Miałem to:

[self.collectionView registerClass:[UICollectionView class] 
     forCellWithReuseIdentifier:@"MyCell"]; 

ale powinno być tak:

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

Więc metoda rozkolejkowania było stworzenie UICollectionView zamiast UICollectionViewCell.

31

Ten pracował dla mnie:

UICollectionViewFlowLayout *aFlowLayout = [[UICollectionViewFlowLayout alloc] init]; 
    [aFlowLayout setItemSize:CGSizeMake(200, 140)]; 
    [aFlowLayout setScrollDirection:UICollectionViewScrollDirectionHorizontal]; 
myCollectionViewController = [[MyCollectionViewController alloc]initWithCollectionViewLayout:flowLayout]; 

Jeśli tworzysz UICollectionView programowo wymagany jest układ.

+1

Przepraszam, to nie to. Jak wspomniałem w pytaniu, które wychodzi z storyboardu i jak pokazano na wyjściu konsoli, istnieje poprawny układ dla widoku kolekcji. Zobacz moją odpowiedź na to, czym okazał się problem. –

+0

Tak, to również jest niezbędne. Twoja komórka miała przypisaną niewłaściwą klasę. –

8

Jeśli dokonujesz zbierania widok kontrolera programowo w UICollectionViewController upewnić, że UICollectionViewController init, metoda wykorzystuje [SUPER initWithCollectionViewLayout] zamiast [Super startowych], na przykład:

-(id) initWithImages:(NSArray *)pImages { 
    UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init]; 
    [layout setMinimumInteritemSpacing:0.0f]; 
    [layout setMinimumLineSpacing:0.0f]; 
    layout.scrollDirection = UICollectionViewScrollDirectionVertical; 
    if (self = [super initWithCollectionViewLayout:layout]) { 
     _images= [[NSArray alloc] initWithArray:pImages]; 
    } 
    return self; 
} 

Od: UICollectionViewController Class Reference:Overview

3

mam ten sam problem i kopalni został rozwiązany za pomocą

UICollectionViewFlowLayout *myLayout = [[UICollectionViewFlowLayout alloc]init]; 
[myLayout setScrollDirection:UICollectionViewScrollDirectionVertical]; 
[myLayout setMinimumInteritemSpacing:0.0f]; 
[myLayout setMinimumLineSpacing:0.0f]; 
UICollectionView *myCollectionView = [[UICollectionView alloc]initWithFrame:viewfame collectionViewLayout:myLayout]; 

zamiast

UICollectionView *myCollectionView = [[UICollectionView alloc]initWithFrame:self.view.frame]; 
[myLayout setScrollDirection:UICollectionViewScrollDirectionVertical]; 
[myLayout setMinimumInteritemSpacing:0.0f]; 
[myLayout setMinimumLineSpacing:0.0f]; 
[myCollectionView setCollectionViewLayout:myLayout]; 
0

biegałam do tej kwestii po powrocie obiekt UICollectionViewLayout z itemSize równy self.view.bounds, zanim pojawił się widok itialized.

0

Jeśli klasa jest Dziedzicz UICollectionViewController lub tworzysz UICollectionView programowo następnie naciskając jednocześnie klasę można ustawić collectionViewLayout jak poniżej

let homeViewController = HomeViewContoller(collectionViewLayout:UICollectionViewLayout()) 
Powiązane problemy