Что это значит UICollectionView _createPreparedCellForItemAtIndexPath:withLayoutAttributes:applyAttributes:?

Ошибка утверждения в -[UICollectionView _createPreparedCellForItemAtIndexPath:withLayoutAttributes:applyAttributes:]

Я получил эту ошибку, начиная с IOS 7. В IOS 6 она работает нормально.

Я смотрю в Интернете, и я нашел это:

http://forums.xamarin.com/discussion/8233/ios-7-crash-in-collectionview

Однако решение не имеет смысла

Я понял. Я неправильно использовал CollectionView.RegisterClassForCell. Видимо, я должен был использовать CollectionView.RegisterNibForCell при настройке контроллера представления. Это решило проблему. iOS 6, должно быть, была более снисходительной.

Может ли кто-нибудь из вас подсказать мне этот баг?

Симптомы:

  1. Крушение
  2. Ошибка утверждения в -[UICollectionView _createPreparedCellForItemAtIndexPath:withLayoutAttributes:applyAttributes:]
  3. Работает в IOS6, а не IOS 7

Код, который меня вызывает подозрение, таков:

- (CGSize)collectionView:(UICollectionView *)collectionView
                  layout:(UICollectionViewLayout*)collectionViewLayout
  sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
    CGSize sz = [BGCollectionViewCellImage defaultSize];
    return sz;
}

Но он кажется слишком обычным.

sz просто CGSize 100*120

Другое это:

- (BGCollectionViewCellImage *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    BGCollectionViewCellImage * cell = [[BGCollectionViewCellImage alloc]init];
    Image * img= self.arImages[indexPath.row];
    [cell setImg:img andIndex:indexPath.row+1];

    return cell;
}

Может быть, я должен использовать dequeue что-то вроде UITableViewCell

Я получил еще одну подсказку. Если бы я попытался убрать из очереди какую-то ячейку, я бы получил следующее:

2013-10-14 21:18:34.346 имя_домена[24667:a0b] * Завершение работы приложения из-за необработанного исключения «NSInternalInconsistencyException», причина: «не удалось удалить из очереди вид: UICollectionElementKindCell с идентификатором BGCollectionViewCellImage — необходимо зарегистрировать перо или класс для идентификатора или подключите ячейку прототипа в раскадровке' * Первый стек вызовов броска: (

Похоже, мне сначала нужно кое-что зарегистрировать.


person user4951    schedule 14.10.2013    source источник


Ответы (5)


Вам необходимо зарегистрировать свою ячейку, используя один из соответствующих методов регистрации, представленных в Справочник по классу UICollectionView

- (void)registerClass:(Class)cellClass forCellWithReuseIdentifier:(NSString *)identifier;
- (void)registerClass:(Class)viewClass forSupplementaryViewOfKind:(NSString *)elementKind withReuseIdentifier:(NSString *)identifier;
- (void)registerNib:(UINib *)nib forCellWithReuseIdentifier:(NSString *)identifier;
- (void)registerNib:(UINib *)nib forSupplementaryViewOfKind:(NSString *)kind withReuseIdentifier:(NSString *)identifier;

Соответствующий из них нужно вызывать только один раз для каждого экземпляра UICollectionView.

person Tim    schedule 14.10.2013
comment
Похоже, что UICollectionView должен создать ячейку с помощью идентификатора повторного использования. - person Harrison Xi; 17.12.2015

В случае, если кто-то нажмет на это, другая возможность - если вы забудете return cell; в конце метода collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath.

person Liron    schedule 22.10.2014
comment
@iNasir рад, что это помогло. - person Liron; 09.01.2017

Без раскадровки вам нужно зарегистрировать свою ячейку внутри viewDidLoad:

// Register Nib
[self.collectionView registerNib:[UINib nibWithNibName:CollectionViewCell_XIB bundle:MAIN_BUNDLE] forCellWithReuseIdentifier:CollectionViewCell_ID];

CollectionViewCell_XIB это имя вашей ячейки xib

CollectionViewCell_ID это идентификатор вашей ячейки xib

person Jordan Montel    schedule 14.10.2013

fwiw У меня были некоторые проблемы с преобразованием проектов из swift2 в swift3. Я использовал NSIndexPath в некоторых местах, где он должен был быть IndexPath.

person Joe Susnick    schedule 17.09.2016

У меня возникла проблема, когда я не подключил представление коллекции, которое у меня было в коде (IBOutlet), к представлению коллекции в XIB, и именно тогда я получил эту ошибку.

person RPM    schedule 27.09.2016