UICollectionView cellForItemAtIndexPath не регистрирует ячейку
Я пытаюсь использовать UICollectionViewCell
, поскольку все, что я хочу отобразить, - это изображение. Я могу добавить изображение в ячейку, используя UIColor colorWithImage:
в свойстве UICollectionViewCell
contentView
.
В моем методе loadView
я регистрирую ячейку следующим образом:
[self.collectionView registerClass:[ImageCell class] forCellWithReuseIdentifier:@"MyCell"];
Ниже мой метод cellForItemAtIndexPath
:
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"MyCell" forIndexPath:indexPath];
// cell customization
return cell;
}
Когда я запускаю его, как только он попадает на строку dequeue, он выходит из строя со следующей ошибкой:
*** Assertion failure in -[UICollectionView _dequeueReusableViewOfKind:withIdentifier:forIndexPath:]
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'could not dequeue a view of kind: UICollectionElementKindCell with identifier MyCell - must register a nib or a class for the identifier or connect a prototype cell in a storyboard'
Я устал настраивать пользовательскую ячейку и использовал ее как класс, и я получил ту же ошибку. Моя пользовательская ячейка подклассифицировала UICollectionViewCell и ничего не реализовала, кроме стандартного initWithFrame
. Это потому, что я хотел просто изменить цвет фона в представлении. Я не уверен, в чем проблема, но может кто-нибудь, пожалуйста, взглянуть на мой код и помочь мне? Я пытался понять это довольно долгое время, совершенно не везти.
Ответы
Ответ 1
Если вы просто хотите отобразить изображение, вам не нужно делать какие-либо подклассы, вы можете установить ячейку backgroundColor
с помощью colorWithPatternImage:
. Зарегистрируйте класс следующим образом:
[self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"Cell"];
Затем используйте его так:
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath];
cell.backgroundColor = [UIColor colorWithPatternImage:[self.results objectAtIndex:indexPath.row]];
return cell;
}
В этом примере результаты array
UIImages
.
Ответ 2
Если вы используете xib в приложении, добавьте следующее в свой метод viewdidLoad
[self.myCollectionView registerNib:[UINib nibWithNibName:@"CollectionViewCell" bundle:nil] forCellWithReuseIdentifier:@"CellIdentifier"];
иначе Если вы используете раскадровку, добавьте следующие
[self.myCollectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"CellIdentifier"];
Наконец, добавьте это (если нет)
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"CellIdentifier" forIndexPath:indexPath];
return cell;
}
Надежда выше поможет.
Ответ 3
Попробуйте установить точку останова на
[self.collectionView registerClass:[ImageCell class] forCellWithReuseIdentifier:@"MyCell"];
Я бы предположил, что ваш loadView (вы имели в виду viewDidLoad?) метод не вызывается, поэтому класс никогда не регистрируется в коллекцииView.
Ответ 4
если ваш просмотр коллекции подключен к раскадровке, и там установлен делегат и источник данных, и вы предоставляете необходимые методы для источника данных и делегата, а затем добавление вызова регистра делает
- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath
верните a UICollectionView
вместо своего собственного подкласса. Так что сделайте либо, но не оба.
Ответ 5
задайте имя идентификатора вашей ячейки, как в коде
![enter image description here]()