Пользовательские свойства UICollectionViewCell становятся нулевыми после удаления из очереди

Итак, у меня есть UICollectionView и пользовательская ячейка, и все это отображается и отлично работает. Я регистрирую класс в viewDidLoad:

myCollectionView = [[UICollectionView alloc] initWithFrame:collectionViewFrame collectionViewLayout:layout];
[myCollectionView setDataSource:self];
[myCollectionView setDelegate:self];
[myCollectionView setBackgroundColor:[UIColor myColor]];
[myCollectionView registerClass:[SBCustomCell class] forCellWithReuseIdentifier:@"Cell"];

В моем методе cellForItemAtIndexPath я удаляю ячейку из очереди, устанавливаю ее свойства и возвращаю ее:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *identifier = @"Cell";

SBCustomCell *cell= [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];

[cell setName: "My Name"];
cell.image = [UIImage imageNamed:@"lol.png"];
cell.score = 100.0;
cell.backgroundColor=[UIColor whiteColor];

return cell;
}

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

-(void)handleLongPress:(UILongPressGestureRecognizer *)longPressRecognizer {

CGPoint locationPoint = [longPressRecognizer locationInView:myCollectionView];

if (longPressRecognizer.state == UIGestureRecognizerStateBegan) {

    NSIndexPath *indexPathOfMovingCell = [myCollectionView indexPathForItemAtPoint:locationPoint];

    SBCustomCell *cell= [myCollectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPathOfMovingCell];

    NSLog(@"%@",cell.name);

Когда я пытаюсь получить доступ к любому из свойств моей пользовательской ячейки, оно (ноль) в консоли. Почему это? Что я делаю неправильно?


person stellarowl12    schedule 23.12.2015    source источник


Ответы (2)


Вам нужно использовать:

SBCustomCell* cell = (SBCustomCell*)[myCollectionView cellForItemAtIndexPath:indexPathOfMovingCell];

вместо:

SBCustomCell* cell = [myCollectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPathOfMovingCell];

Кроме того, вы используете SBSingleCandidateUnitView в качестве типа ячейки вместо SBCustomCell.

person dudeman    schedule 23.12.2015
comment
Привет, Майк, спасибо за ответ. На самом деле он у меня есть как SBCustomCell. Я просто редактировал код для использования в StackOverflow и забыл изменить его. Мой вопрос: почему бы мне не использовать метод удаления из очереди? Я хочу вернуть пользовательскую ячейку, а не общую ячейку UICollectionView. Общая ячейка не имеет настраиваемых свойств, которые я установил. - person stellarowl12; 23.12.2015
comment
@ stellarowl12: Вы не используете удаление из очереди, потому что это дает вам новую ячейку для добавления в представление коллекции. Несмотря на то, что метод возвращает UICollectionViewCell, вы можете привести его к типу ячейки, которым он является на самом деле. Я обновил свой ответ, чтобы показать это. - person dudeman; 23.12.2015
comment
Итак, я применил его, и ошибок или предупреждений нет, однако, когда я пытаюсь использовать NSLog для распечатки любого из свойств пользовательской ячейки, которые я установил в cellForItemAtIndexPath, все они по-прежнему распечатываются как Null.... любая идея, почему это так дело? Я устанавливаю его в неправильном месте? - person stellarowl12; 23.12.2015
comment
@ stellarowl12: Извините, я не думаю, что смогу дать вам точное представление о том, почему он это делает. Я думаю, что отладка - ваш лучший выбор. - person dudeman; 23.12.2015
comment
Так что просто уточнить. Я могу использовать удаление из очереди в cellforitematindexpath, но не в методе handleLongPress, верно? - person stellarowl12; 23.12.2015
comment
@ stellarowl12: Да. Удаление из очереди предназначено для добавления новой ячейки в табличное представление. Доступ к конкретной ячейке, уже находящейся в табличном представлении, осуществляется с помощью метода cellForItemAtIndexPath. - person dudeman; 23.12.2015
comment
Я понял это, это было связано с моими свойствами в моем пользовательском файле ячейки. Спасибо за помощь Майк - person stellarowl12; 24.12.2015
comment
Потрясающий. Поздравляем. И не проблема, рад помочь. - person dudeman; 24.12.2015

Это было потому, что я неправильно устанавливал свои свойства. В моем заголовочном файле мне нужно установить свойство, также известное как @property... UIImageView myImageView;

И в моем файле CustomCell.m я не должен переопределять эти сеттеры и геттеры. Вместо этого просто выделяйте и инициализируйте их и добавляйте в представление.

Вернувшись в свой ViewController.m, я должен был добавить свойства как таковые:

customcell.myImageView.image = [UIImage imageNamed:@"cartman.png"];

person stellarowl12    schedule 23.12.2015