Подтвердить что ты не робот

Ошибка не могла удалить из вида вид UICollectionElementKindCell

Взятие первого погружения в представления коллекции и запуск этой ошибки:

Завершение приложения из-за неотображенного исключения "NSInternalInconsistencyException", причина: "не может удалить из вида вид: UICollectionElementKindCell с идентификатором Cell - должен зарегистрировать ниб или класс для идентификатора или подключить ячейку прототипа в раскадровке"

Код очень прост, как показано ниже. Я не могу для жизни меня понять, что это такое, чего я не хватает.

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath];
cell.backgroundColor = [UIColor whiteColor]; 
return cell;
}

Контроллер представления коллекции был создан с использованием nib, и делегаты и источники данных оба установлены для владельца файла.

Просмотр файла заголовка контроллера также является основным.

@interface NewMobialViewController_3 : UICollectionViewController <UICollectionViewDataSource, UICollectionViewDelegateFlowLayout>
@end
4b9b3361

Ответ 1

Из документации UICollectionView для метода dequeue:

Важно: Вы должны зарегистрировать файл класса или nib, используя метод registerClass: forCellWithReuseIdentifier: или registerNib: forCellWithReuseIdentifier: перед вызовом этого метода.

Ответ 2

Вам нужно использовать тот же идентификатор между аргументом dequeueReusableCellWithReuseIdentifier и свойством UICollectionViewCell.

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

identifier

Ответ 3

Дополняя то, что написал @jrtuton... Что вам нужно:

1) Зарегистрируйте свой файл nib, чтобы "подключить" его к вашему идентификатору:

//MyCollectionView.m
- (void) awakeFromNib{
 [self registerNib:[UINib nibWithNibName:@"NibFileName" bundle:nil]   forCellWithReuseIdentifier: @"MyCellIdentifier"];
}

2) Используйте свой идентификатор для загрузки пользовательской ячейки из низа:

//MyCollectionView.m
- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath  *)indexPath {
    MyCustomCollectionViewCell* cell = [cv dequeueReusableCellWithReuseIdentifier:@"MyCellIdentifier" forIndexPath:indexPath];
}

3) Всегда используйте статическую NSString *, чтобы снова избежать того же идентификатора в вашем приложении.

Ответ 4

у меня все на 100% сделано правильно. но по какой-то причине я получил ту же ошибку в течение часа, то что я сделал:

  1. перейти к раскадровке
  2. выберите прототип ячейки (в моем случае)
  3. очистите имя класса от инспектора идентичности, затем перепишите его
  4. переписать имя идентификатора в инспекторе атрибутов

просто переделайте этот шаг, даже если я исправил его раньше, это как xcode пропускает что-то в определенную наносекунду!

Ответ 5

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

В моем случае я объявил глобальный идентификатор

let identifier = "CollectionViewCell"

и должен был использовать self прямо перед его использованием:

collectionView.dequeueReusableCellWithReuseIdentifier(self.identifier, forIndexPath: indexPath) as! CollectionViewCell

Надеюсь, это поможет кому-то:)

Ответ 6

Swift4.0

Если в это время ваш UITableViewCell имеет формат xib, вы должны зарегистрироваться в UITableView.

override func viewDidLoad(){
    super.viewDidLoad()

    self.yourtableview.register(UINib(nibName: "yourCellXIBname", bundle: Bundle.main), forCellReuseIdentifier: "YourCellReUseIdentifier")
   }

Ответ 7

В раскадровке нужно указать правильный идентификатор многократного использования, который вы дали в коде при регистрации collectionViewCell.

Вот код

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ClctnVC", for: indexPath)as! ClctnVC
    return cell            
}

Ответ 8

Если вы используете раскадровку вместо XIB, вот несколько шагов.

  1. Убедитесь, что вы правильно указали идентификатор своей ячейки.

Prototype cell Attribute panel

  1. В ColletionViewDelegate.

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "YourCellName", for: indexPath)as! YourCellName
        return cell            
    }
    
  2. Это. Вы также не хотите добавлять registerClass: forCellWithReuseIdentifier: что приведет к ошибке nil элемента.

Ответ 9

Для меня это было исправлено (примерно) так же, как и для ответа Омара, за исключением того, что я закончил тем, что создал новый пользовательский класс UICollectionViewCell и дал идентификатору повторного использования ячеек новое/отличающееся от того, которое я использовал в другом месте приложения. Сработало сразу после этого.

Ответ 10

Swift 5

1) Убедитесь, что у вас есть правильный deque для HEADER, возможно, вы используете обычный для нормальных клеток.

переопределить func collectionView (_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) → UICollectionReusableView {let header = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: headerId, для} returnP): index

2) дважды проверьте регистрацию (ViewDidLoad)

//Зарегистрируйте заголовок collectionView.register(HeaderCell.self, forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: headerId)

Ответ 11

Если вы создаете его по коду, вы должны создать пользовательский UICollectionViewCell, затем init a UICollectionView и использовать loadView, чтобы установить представление - это созданный UICollectionView. Если вы создаете в viewDidload(), это не сработает. Кроме того, вы также можете перетащить UICollectionViewController, это экономит много времени.