Подкласс UICollectionViewCell приводит к тому, что он никогда не будет выбран

Я попытался создать подкласс UICollectionViewCell и загрузить из файла пера:

- (id)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        NSArray *arrayOfViews = [[NSBundle mainBundle] loadNibNamed:@"DatasetCell" owner:self options:nil];

        if ([arrayOfViews count] < 1) {
            return nil;
        }

        if (![[arrayOfViews objectAtIndex:0] isKindOfClass:[UICollectionViewCell class]]) {
            return nil;
        }

        self = [arrayOfViews objectAtIndex:0];

        UIView *view = [UIView new];
        view.frame = self.frame;
        view.backgroundColor = [UIColor orangeColor];
        self.selectedBackgroundView = view;
    }

    return self;
}

Я столкнулся с проблемой, когда выбрана ячейка, cell.selected не устанавливается. Это всегда NO, что приводит к проблеме отмены выбора ячеек.

Как мне справиться с переводом ячейки в выбранное состояние?

РЕДАКТИРОВАТЬ:

Первоначально я загружал пользовательский UICollectionViewCell как класс:

[collectionView registerClass:[DatasetCell class] forCellWithReuseIdentifier:@"dataCell"];

Переключился на загрузку пера:

[collectionView registerNib:[UINib nibWithNibName:@"DatasetCell" bundle:nil] forCellWithReuseIdentifier:@"nibCell"];

У меня такая же проблема выбора/отмены выбора в обоих направлениях.


person Padin215    schedule 22.03.2013    source источник
comment
Вы перезаписываете значение self перед назначением view.frame = self.frame — это выглядит подозрительно.   -  person Martin R    schedule 23.03.2013
comment
Зачем вообще нужен этот код? Если вы используете registerNib:forCellWithReuseIdentifier: и dequeueReusableCellWithReuseIdentifier:forIndexPath: в контроллере представления коллекции, пользовательская ячейка загружается непосредственно из файла NIB.   -  person Martin R    schedule 23.03.2013
comment
мой Nib имеет метки, которые мне нужно изменить значения. Я впервые работаю с пером (обычно делаю это программно). Я делаю что-то неправильно?   -  person Padin215    schedule 23.03.2013
comment
Я не уверен на 100%, но я думаю, что вы можете использовать 2 метода, упомянутых выше, в контроллере представления. В подклассе табличного представления вы можете переопределить awakeFromNib для внесения изменений.   -  person Martin R    schedule 23.03.2013
comment
Хорошо, я изменил его с загрузки класса на загрузку пера. Выбор и отмена выбора работают по назначению, но я не уверен, как теперь получить доступ к UILabels. Я изменил класс пера с MyCustomUICollectionView на UICollectionViewClass.   -  person Padin215    schedule 23.03.2013
comment
Вы должны установить класс ячейки в свой подкласс collectionviewcell. Не устанавливайте класс для владельца файла. Затем вы можете управлять перетаскиванием соединений из ячейки в файле пера в файл .h вашего подкласса.   -  person Martin R    schedule 23.03.2013
comment
Хорошо, я переключил его обратно на свой пользовательский класс и загрузил его из пера, и у меня все еще есть проблема с выбором / отменой выбора.   -  person Padin215    schedule 23.03.2013
comment
давайте продолжим это обсуждение в чате   -  person Martin R    schedule 23.03.2013


Ответы (1)


Основная ошибка в том, что вы определили свойство

@property (nonatomic) BOOL isSelected;

в вашем пользовательском подклассе UICollectionViewCell (в «DatasetCell.h»), который мешает унаследованному «выбранному» свойству UICollectionViewCell.

Если вы удалите это определение свойства, выбор и отмена выбора будут работать должным образом, по крайней мере, для ячеек, загруженных из файла пера через registerNib:....

Для ячеек, загруженных через registerClass:..., вызывается initWithFrame. Вы пытаетесь загрузить ячейку из nib-файла туда. Это не имеет особого смысла и, похоже, работает неправильно. Вы должны либо создать ячейку программно в initWithFrame и использовать registerClass:, либо создать ячейку в файле пера и использовать registerNib:.

initWithFrame не вызывается для ячеек, загруженных из файла пера, используйте awakeFromNib, если вы хотите внести изменения в ячейку.

Надеюсь, это поможет!!

person Martin R    schedule 23.03.2013
comment
Для подклассов UICollectionViewCell следует ли использовать awakeFromNib для инициализации свойств выхода IB (например, положения, ширины), даже если не используется пользовательский XIB? - person Crashalot; 17.04.2016