UICollectionView не содержит UICollectionViewCell в IB

Я пытаюсь добавить UICollectionView в файл .nib в IB. Я проработал несколько учебников и не имел проблем.

В моем существующем приложении, когда я перетаскиваю представление коллекции в представление в IB, а затем разворачиваю объект, существует Flow Flow Flow Layout, но нет ячейки просмотра коллекции. Я также не могу перетащить ячейку в представление коллекции. Также представление коллекции отображается по-разному, показывая изображение сетки ячеек вместо обычного белого блока.

Я попытался создать новый контроллер представления с помощью nib и получить те же результаты при добавлении коллекции.

Это приложение WAS предназначалось для iOS 4.2, но я изменил цель развертывания на iOS 6.

В любых новых проектах я не получаю такого поведения.

Ответ 1

Я не могу сказать, почему это не работает, но для меня подход подкласса из этого сообщения в блоге разрешил проблему:

http://www.adoptioncurve.net/archives/2012/09/a-simple-uicollectionview-tutorial.php

вот краткий обзор:

  • создайте новый класс MyViewCell, который расширяет UICollectionViewCell и при необходимости создаст свойства, действия, выходы и методы.

@interface MyViewCell : UICollectionViewCell

  • создать представление (файл xib) с помощью Cell Collection Cell в качестве его корневого объекта (и удалить объект, который создается по умолчанию).
  • в атрибутах задан пользовательский класс этой коллекции View Cell для вашего расширенного класса MyViewCell (вместо UICollectionViewCell по умолчанию).
  • в атрибутах в представлении "Повторное использование коллекции" определяют идентификатор, например. myCell, вам понадобится это позже, чтобы зарегистрировать ваш вызов.
  • вернитесь к своему пользовательскому классу и измените метод inithWithFrame для загрузки и использования созданного представления.

    - (id)initWithFrame:(CGRect)frame 
    { 
       self = [super initWithFrame:frame]; 
       if (self) 
       { 
         // Initialization code 
         NSArray *arrayOfViews = [[NSBundle mainBundle] loadNibNamed:@"CVCell" owner:self options:nil];
    
         if ([arrayOfViews count] < 1) { return nil; }
    
         if (![[arrayOfViews objectAtIndex:0] isKindOfClass:[UICollectionViewCell class]]) { return nil; }
    
         self = [arrayOfViews objectAtIndex:0];
       }
       return self;
    }
    
  • то вы можете зарегистрировать этот класс, который будет использоваться CollectionView с помощью

[self.collectionView registerClass:[MyViewCell class] forCellWithReuseIdentifier:@"myCell"];

Ответ 2

Прошло некоторое время с тех пор, как был задан вопрос, но в последнее время я столкнулся с тем же вопросом.

В конце концов, я нашел ответ здесь.

Короче:

  • Вы не можете перетаскивать UICollectionViewCell в UICollectionView, если вы находитесь в файле .xib. Это возможно только в раскадровке.
  • Обходной путь заключается в создании файла .xib для вашей пользовательской ячейки и регистрации ячейки вручную, используя:

    [self.collectionView registerClass:[CollectionViewCell class] forCellWithReuseIdentifier:CELL_ID];

Ответ 3

Определите вид соты в отдельном файле. Представление должно иметь тип UICollectionViewCell или подкласс.

Затем вы должны зарегистрировать наконечник в своем представлении коллекции:

- (void)viewDidLoad
{
    UINib *cellNib = [UINib nibWithNibName:@"MyNib" bundle:nil];
    [self.collectionView registerNib:cellNib forCellWithReuseIdentifier:@"cell"];
}

Ответ 4

Хотя эти ответы верны, основная причина проблемы довольно тонкая, и Apple нуждается в обновлении своего сообщения об ошибке в журнале. Когда вы увидите:

Unknown class MyViewCell in Interface Builder file.

На самом деле это означает, что в исходном коде отсутствует объявление @implementation или что файл .m не добавлен в цель. Поэтому проверьте свой код и убедитесь, что у вас есть:

@implementation MyViewCell

@end

Это верно как для UITableViewCell, так и для UICollectionViewCell.

Я обсуждаю проблему далее в fooobar.com/info/15512/... для общего случая.

Интересно, что если вам не хватает @implementation и звоните:

[self.myCollectionView registerClass:[MyViewCell class] forCellWithReuseIdentifier:@"MyViewCell"];

Вы увидите:

Undefined symbols for architecture armv7:
  "_OBJC_CLASS_$_MyViewCell", referenced from:
      objc-class-ref in MyViewController.o
ld: symbol(s) not found for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Итак, Apple знает о проблеме, они просто не обнаруживают ее во время компиляции. Я бы посоветовал не помещать пользовательские ячейки в отдельные наконечники или вызвать registerClass: forCellWithReuseIdentifier:. Это намного чище, чтобы сохранить пользовательскую ячейку внутри своего контейнера UICollectionView или UITableView в Interface Builder.