2013-09-26 13 views
7

W mojej aplikacji był UICollectionView przy użyciu flowLayout i działał pięknie w iOS 6, ale strasznie się niestety w iOS 7. Jak tylko podzielę się widokiem zawierającym mój UICollectionView, oto co dzieje:UICollectionView + iOS 7/Xcode 5 = Asercja nie powiodła się

*** Assertion failure in -[UICollectionView _createPreparedSupplementaryViewForElementOfKind:atIndexPath:withLayoutAttributes:applyAttributes:], /SourceCache/UIKit/UIKit-2903.2/UICollectionView.m:1401 
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'the view returned from -collectionView:viewForSupplementaryElementOfKind:atIndexPath 
(UICollectionElementKindSectionHeader,<NSIndexPath: 0x145f3f50> {length = 2, path = 0 - 0}) was not retrieved by calling -dequeueReusableSupplementaryViewOfKind:withReuseIdentifier:forIndexPath: or is nil' 
(<UICollectionReusableView: 0x145f9400; frame = (0 0; 320 20); layer = <CALayer: 0x145f90c0>>) 

Odpowiedz

12

Kiedy uaktualniony do iOS 7 wpadłem na to. Problem polegał na tym, że nie powinieneś być tak jednoznaczny ze swoim źródłem danych. Jeśli masz następujące, usuń go:

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath { 
    return nil; 
} 
+0

Doskonała odpowiedź @ZaBlanc, dziękuję! Jakieś pomysły, co zmieniło się z iOS 6 na 7? [The iOS 7 API Diffs] (https://t.co/vuiz2TaU3r) nie wyświetlają niczego oprócz dodatków do UICollectionView –

1

Musisz zarejestrować UINib z wystąpieniem UICollectionView:

UINib *nib = [UINib nibWithNibName:@"YourNibNameWithoutExtension" bundle:nil]; 
[collectionView registerNib:nib forCellWithReuseIdentifier:@"YourReuseIdentifier"]; 

I tworzenie wszystkich przypadkach UICollectionViewCell poprzez -[UICollectionView dequeueReusableCellWithReuseIdentifier:forIndexPath:].

Ten komentarz w Apple UICollectionView.h wyjaśnia wymóg:

// The cell that is returned must be retrieved from a call to -dequeueReusableCellWithReuseIdentifier:forIndexPath: 
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath; 
+0

Dzięki @bneely, już rejestrowałem stalówki (i początkowo klasy), ale okazało się, że odpowiedź ZaBlanc naprawiła tajemniczą katastrofę. Nie pytaj mnie, jak/dlaczego, ponieważ nic w UICollectionView nie było naprawdę przestarzałe w funkcjach API iOS7 Diffs. –

6

będzie się zawiesić, jeśli wrócisz nil w tej funkcji:

- (UICollectionReusableView*)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath 

W zasadzie jedynym powodem, trzeba by powrócić nil jest jeśli „rodzaj "NSString nie jest typem, jakiego oczekujesz. W takim przypadku po prostu usuń ten obiekt z kreatora interfejsu. Miałem tę samą katastrofę, ponieważ moim zdaniem kolekcja miała stopkę w konstruktora interfejsu, ale nie było wywołanie kodu registerNib (jak bneely opisano powyżej), aby założyć stopkę. Dostałbym się do viewForSupplementaryElementOfKind i wróciłem do zera, ponieważ był to rodzaj, którego się nie spodziewałem (co z pewnością spowoduje awarię).

0

dostać ten błąd, ponieważ kolekcja ma nagłówek. Mam to po dodaniu nagłówka w IB. Usunąć nagłówek lub sprawdź Delegat opcji nagłówka

1

mam ten problem, jak rozwiązać

Myślę, że można sprawdzić czy sprawdzić w sekcji nagłówka IB Collection Widok -> Akcesoria -> Sekcja nagłówka

1

dostałam ten zapominając ustawić moją klasę do odpowiedniego typu w interfejsie konstruktora i nie okablowania i gniazd

+0

Aha ... coś takiego też się stało! Dziękuję za ten komentarz, sprawił, że sprawdziłem mój nowo utworzony widok wielokrotnego użytku .. teraz wyjątek wewnętrznej niespójności ma sens! :RE – Pavan

0

Bądź pewien, że ustawiłeś widok kolekcja źródło danych i delegata. W moim przypadku błąd ten został zgłoszony z tego powodu.

Powiązane problemy