2013-09-26 2 views
7

В моем приложении был UICollectionView с использованием flowLayout, и он отлично работал в iOS 6, но с ошибкой в ​​iOS 7. Как только я перехожу к представлению, содержащему мой UICollectionView, вот что бывает:UICollectionView + iOS 7/Xcode 5 = ошибка подтверждения

*** 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>>) 

ответ

12

Когда я обновлен до прошивки 7 Я побежал в это. Проблема в том, что вы не должны быть настолько явным с вашим источником данных. Если у вас есть следующее, удалите его:

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

Отличный ответ @ZaBlanc, спасибо! Любая идея, что изменилось с iOS 6 до 7? [Iiff 7 API Diffs] (https://t.co/vuiz2TaU3r) ничего не показывают, кроме дополнений к UICollectionView –

1

Вы должны зарегистрировать UINib с экземпляра UICollectionView:

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

И создать все экземпляры UICollectionViewCell через -[UICollectionView dequeueReusableCellWithReuseIdentifier:forIndexPath:].

Этот комментарий в UICollectionView.h от Apple объясняет требование:

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

Спасибо @bneely, я уже регистрировал nibs (и классы изначально), но оказывается, что ответ ZaBlanc исправил тайну. Не спрашивайте меня, как/почему, потому что ничего в UICollectionView действительно не рекомендуется в iOS7 API Diffs. –

6

Это будет вылетать, если вы вернетесь nil в этой функции:

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

В принципе, единственная причина, вы должны вернуть nil, если в «виде «NSString - это не тот тип, который вы ожидаете. В этом случае просто удалите этот объект в построителе интерфейса. У меня был такой же крах, потому что в моем представлении коллекции был нижний колонтитул в построителе интерфейса, но я не вызывал код registerNib (как описано выше), чтобы настроить нижний колонтитул. Я добрался до viewForSupplementaryElementOfKind и вернул нуль, потому что это был вид, которого я не ожидал (что гарантированно приведет к сбою).

0

Вы получаете эту ошибку, потому что ваша коллекция имеет заголовок. Я получил это после добавления заголовка в IB. Удалить заголовок или проверить делегата для опций заголовка

1

Я получил эту проблему, решенной

Я думаю, вы могли бы проверить вы проверить заголовок раздела в IB Collection View -> Аксессуары -> Раздел заголовка

1

Я получил это, забыв установить свой класс к нужному типу в интерфейсе строителя, а не проводки и розетки

+0

Ага ... что-то подобное произошло тоже! Спасибо за этот комментарий, это заставило меня проверить мое вновь созданное многоразовое представление .. теперь исключение внутренней несогласованности имеет смысл! : D – Pavan

0

Убедитесь, что вы установили вид коллекции источника данных и делегат. В моем случае эта ошибка была выбрана из-за этого.

 Смежные вопросы

  • Нет связанных вопросов^_^