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

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. Это потому, что я хотел просто изменить цвет фона в представлении. Я не уверен, в чем проблема, но может кто-нибудь, пожалуйста, взглянуть на мой код и помочь мне? Я пытался понять это довольно долгое время, совершенно не везти.

4b9b3361

Ответ 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