Персонализираните свойства на UICollectionViewCell са null след изваждане от опашката

Така че имам 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);

Когато се опитам да осъществя достъп до някое от свойствата на персонализираната ми клетка, то е (null) в конзолата. Защо така? какво правя грешно


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: Не използвате dequeue, защото това ви дава нова клетка, която да добавите към изгледа на колекцията. Въпреки че методът връща 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