Ошибка не могла удалить из вида вид 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
Ответы
Ответ 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% сделано правильно. но по какой-то причине я получил ту же ошибку в течение часа, то что я сделал:
- перейти к раскадровке
- выберите прототип ячейки (в моем случае)
- очистите имя класса от инспектора идентичности, затем перепишите его
- переписать имя идентификатора в инспекторе атрибутов
просто переделайте этот шаг, даже если я исправил его раньше, это как 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, вот несколько шагов.
- Убедитесь, что вы правильно указали идентификатор своей ячейки.
![Attribute panel]()
-
В ColletionViewDelegate.
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "YourCellName", for: indexPath)as! YourCellName
return cell
}
-
Это. Вы также не хотите добавлять 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
, это экономит много времени.