Нераспознанный селектор в пользовательском подклассе

Я потратил некоторое время на поиск других подобных сообщений, но не смог найти точную проблему. Я новичок в iOS и объективно, так что это, вероятно, очень просто.

Я создаю подкласс UICollectionViewCell:

@interface FooCollectionViewCell : UICollectionViewCell
@property (weak, nonatomic) IBOutlet UILabel *cellLabel;
@end

И в моем собственном подклассе UIViewController я пытаюсь установить значение для cellLabel:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
        FooCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath];

    // Configure the cell
    UILabel *label = [[UILabel alloc] init];
    label.text = @"whatever";
    cell.cellLabel = label;

    return cell;
}

Мое приложение вылетает при запуске:

[UICollectionViewCell setCellLabel:]: нераспознанный селектор отправлен экземпляру 0x7fef224144f0

Если я понимаю эту ошибку, похоже, что она жалуется, что я пытаюсь установить свойство cellLabel для экземпляра суперкласса UICollectionViewCell вместо экземпляра подкласса FooCollectionViewCell.

Однако, когда я добавляю точку останова в эту строку и смотрю на свои переменные, я вижу:

ячейка FooCollectionViewCell * 0x7fcb5340dcd0 0x00007fcb5340dcd0

Из моего кода также кажется очевидным, что объект должен иметь тип FooCollectionViewCell, потому что это тип cell, который создается как экземпляр.

Мой процесс настройки моей раскадровки был следующим:

  1. Перетащите CollectionViewController в мою раскадровку
  2. Установите для его пользовательского класса значение FooCollectionViewController. Кажется, это работает, потому что мой код вызывается.
  3. Щелкните ячейку-прототип, автоматически созданную в автоматически созданном представлении коллекции, установите для ее пользовательского класса значение FooCollectionViewCell. Установите идентификатор на «FooCell» и обновите переменную reuseIdentifier в моем ViewController, чтобы она также была «FooCell».

Есть что-то, что мне не хватает?


person mpuncel    schedule 08.04.2015    source источник
comment
В вашей раскадровке/NIB вы установили пользовательский класс вашей ячейки представления таблицы на FooCollectionViewCell для одного с вашим идентификатором повторного использования?   -  person Tom K    schedule 08.04.2015
comment
Используете ли вы раскадровку или используете пользовательский .xib, если вы используете .xib, вам нужно зарегистрировать свой nib в методе viewdidload. Я думаю, что ячейка создается, но не присваивает значение, попробуйте очистить папку и сбросить симулятор, тогда это решит вашу проблему.   -  person Muhammad Waqas Bhati    schedule 08.04.2015
comment
В вашем коде нельзя увидеть, какой класс используется для создания экземпляра ячейки. Тип ссылки var cell не имеет никакого значения. Что вы установили в своем xib/SB? Пожалуйста, добавьте проверку класса ячейки в свой код, чтобы увидеть, создает ли другой класс экземпляр объекта ячейки.   -  person Amin Negm-Awad    schedule 08.04.2015
comment
@Tom, да, идентификатор повторного использования совпадает, и пользовательский класс правильно установлен в моей раскадровке. Хотя, если бы идентификатор повторного использования не совпадал, я бы не ожидал, что этот код вообще будет вызываться, верно? И если пользовательский класс не соответствует FooCollectionViewCell, я могу ожидать, что вызов dequeReusableCellWithReuseIdentifier завершится ошибкой типа?   -  person mpuncel    schedule 08.04.2015
comment
Нет, это не приведет к провалу. Вы просто говорите компилятору, что ожидаете, что ячейка будет FooCollectionViewCell, и компилятор предполагает, что вы знаете, что делаете. Вы должны ответить на вопрос Тома; скорее всего в этом проблема.   -  person rdelmar    schedule 08.04.2015
comment
@rdelmar хорошо, я предполагал, что назначение завершится ошибкой, если типы не совпадают, это, вероятно, означает, что я настроил что-то неправильно в другом месте, и команда deque фактически дает мне экземпляр UICollectionViewCell?   -  person mpuncel    schedule 08.04.2015
comment
Да это так. Ваша проблема такова, как предполагает Том.   -  person rdelmar    schedule 08.04.2015
comment
Добавлено объяснение процесса настройки моей раскадровки, чтобы увидеть, не упущено ли что-то очевидное. В основном я следую techotopia.com/index.php/   -  person mpuncel    schedule 08.04.2015


Ответы (2)


вы говорите, что следуете учебнику. Итак, вы сделали эти шаги?

После того, как базовые классы представлений коллекций реализованы и связаны с объектами раскадровки, пришло время спроектировать ячейку. Это просто вопрос перетаскивания элементов из библиотеки объектов в ячейку прототипа в представлении раскадровки. Кроме того, размер ячейки можно изменить, выбрав ее и используя получившиеся маркеры изменения размера. Точный дизайн ячейки полностью зависит от того, что должно отображаться. Однако для целей этого примера каждая ячейка будет просто отображать изображение.

Потому что вы создаете новую метку в коде, когда она уже должна быть доступна в ячейке прототипа. Вам нужно только назначить cell.cellLabel.text = @"bla bla";

UILabel *label = [[UILabel alloc] init];
label.text = @"whatever";
cell.cellLabel = label;
person Nik Yekimov    schedule 08.04.2015
comment
даже это не работало. Проблема заключалась в том, что у меня был конфликтующий оператор в коде, регистрирующем суперкласс UICollectionViewCell с моим идентификатором повторного использования. То, что вы упомянули, было второй проблемой, которую мне нужно было сделать, чтобы увидеть изменение текста. - person mpuncel; 08.04.2015

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

[self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:reuseIdentifier];

в моем методе viewDidLoad. Так что я думаю, что это перевешивало то, что я делал в своей раскадровке. FML, но я кое-чему научился. Спасибо за помощь!

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

person mpuncel    schedule 08.04.2015