Ошибка утверждения iOS в UICollectionView

Я получаю ошибку...

*** Assertion failure in -[UICollectionView _dequeueReusableViewOfKind:withIdentifier:forIndexPath:], /SourceCache/UIKit/UIKit-2372/UICollectionView.m:2249

При попытке отобразить UICollectionView.

Линии, вызывающие это...

static NSString *CellIdentifier = @"Cell";

UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath];

Произошла ошибка при исключении из очереди.

Других ошибок нет, поэтому я изо всех сил пытаюсь понять, с чего начать.

Кто-нибудь может пролить свет на это?


person Fogmeister    schedule 26.09.2012    source источник


Ответы (7)


Вам необходимо зарегистрироваться, как показано ниже:

[self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"MY_CELL"];
person Gaurav    schedule 10.11.2012

Читал документы (возможно, надо было сделать это первым:))

Во всяком случае, collectionView, который я использую, находится в отдельном файле xib (а не в раскадровке) и из документов...

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

Спасибо

person Fogmeister    schedule 26.09.2012
comment
Когда вы вызываете этот метод? в строке перед UICollectionViewCell *cell = [collectionView dequeue... или другим способом - person Jordan Medlock; 08.10.2012
comment
Мне пришлось зарегистрировать его в методе viewDidLoad. Вам нужно зарегистрировать xib только один раз для всего collectionView. Затем, когда вы вызываете dequeueCellWithIdentifier, он переходит к зарегистрированному вами xib. - person Fogmeister; 08.10.2012
comment
У меня была та же проблема, но по какой-то странной причине компилятор не распознал метод registerClass в viewDidLoad, поэтому мне пришлось переместить его в метод cellForItemAtIndexPath. - person Sam Spencer; 14.10.2012
comment
@Sam: Причиной этого может быть то, что ваш объект UICollectionView еще не был выделен, когда вы вызвали метод registerClass:forCellWithReuseIdentifier: в viewDidLoad. Этого не должно происходить, если представление коллекции определено с помощью Interface Builder, поскольку viewDidLoad вызывается после инициализации представления коллекции. Если вы инициализируете представление коллекции программно, просто убедитесь, что оно выделено до вызова для него метода registerClass:.... Я не думаю, что cellForItemAtIndexPath - идеальное место для этого... - person CGee; 13.01.2014
comment
Спасибо! Вы сэкономили мое время :) - person Oleg Popov; 30.07.2014
comment
@ Сэм, у меня была та же проблема, и причина в том, что `cellForItemAtIndexPath` вызывался в [super viewDidLoad], когда я переместил registerNib:... до [super viewDidLoad], и он работал нормально. - person Zuzana Paulis; 21.02.2016

У меня такая же проблема. Вот как я это решил.

Переехать

[self.pictureCollectionView registerNib:[UINib nibWithNibName: bundle:nil] forCellWithReuseIdentifier:reuseID]

to be in - (void)viewDidLoad,

а не метод - (void)awakeFromNib.

person U.Jhon    schedule 05.06.2016

Убедитесь, что если вы используете метод registerNib::

UINib *nibH = [UINib nibWithNibName:HEADER_ID bundle:nil];
[collectionView registerNib:nibH
 forSupplementaryViewOfKind:UICollectionElementKindSectionHeader 
        withReuseIdentifier:HEADER_ID];

что ТАКЖЕ в файле пера, когда вы выбираете повторно используемое представление коллекции верхнего уровня, используйте инспектор атрибутов и убедитесь, что Identifier установлено на то же значение, что и вы. переходя к параметру withReuseIdentifier:.

person bshirley    schedule 05.02.2013

У меня сбой только на iOS 9 (iOS 10/11 работают нормально).

У меня не было собственного подкласса Flow Layout, но я устанавливал headerReferenceSize непосредственно на существующем. Итак, в Interface Builder с включенным Заголовком раздела я получил этот сбой, без галочки все работает нормально и заголовки отображаются правильно, так как я установил размер в коде.

введите здесь описание изображения

person heyfrank    schedule 12.09.2018
comment
Возможно, несколько приложений больше поддерживают iOS 9 :D. Но рад, что помогло! - person heyfrank; 01.05.2019

Заменять

NSString *CellIdentifier = @"Cell";

с

static NSString *CellIdentifier = @"Cell";
person CAMOBAP    schedule 26.09.2012
comment
Пробовал это первым. Я только что читал документы. Мне нужно зарегистрировать класс или nib перед запуском dequeue... - person Fogmeister; 26.09.2012

Я видел, как эта ошибка появляется при использовании нескольких UICollectionView с уникальными идентификаторами ReuseIdentifier. В ViewDidLoad вы хотите зарегистрировать reuseIdentifier каждого CollectionView следующим образом:

[_collectionView1 registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"collectionView1CellIdentifier"];
[_collectionView2 registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"collectionView2CellIdentifier"];

Затем, когда вы доберетесь до «- (UICollectionViewCell *) collectionView: (UICollectionView *) collectionView cellForItemAtIndexPath: (NSIndexPath *) indexPath», вы хотите убедиться, что вы не пытаетесь установить ячейку для collectionView1 в reuseIdentifier для collectionView2 или вы получит эту ошибку.

НЕ ДЕЛАЙТЕ ЭТОГО: (иначе collectionView2 увидит неправильный идентификатор и исправится, прежде чем увидит ожидаемый идентификатор)

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

if(collectionView != _collectionView1){
   cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"collectionView2CellIdentifier" forIndexPath:indexPath];
}

cell.backgroundColor = [UIColor greenColor];
return cell;

СДЕЛАЙТЕ ЭТО:

UICollectionViewCell *cell;

if(collectionView == _collectionView1){
    cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"collectionView1CellIdentifier" forIndexPath:indexPath];
}else{
   cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"collectionView2CellIdentifier" forIndexPath:indexPath];
}

cell.backgroundColor = [UIColor greenColor];
return cell;
person ColossalChris    schedule 15.04.2015