Что значит 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 при настройке viewcontroller. Это поставило проблему. iOS 6, должно быть, был более прощающим.

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

Симптомы:

  • Краш
  • Ошибка утверждения в - [UICollectionView _createPreparedCellForItemAtIndexPath: withLayoutAttributes: applyAttributes:]
  • Работает в 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 - должен зарегистрировать ниб или класс для идентификатора или подключить прототип ячейки в раскадровке ' * Первый стек вызовов броска: (

Похоже, я сначала что-то зарегистрировал.

Ответ 1

Вам необходимо зарегистрировать свою ячейку, используя один из соответствующих методов регистрации, указанный в Справочник класса 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.

Ответ 2

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

Ответ 3

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

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

CollectionViewCell_XIB - имя вашей ячейки xib

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

Ответ 4

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

Ответ 5

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