У меня есть функция, которая обновляет существующий UICollectionView. UICollectionView создан, я его вижу, но когда я хочу получить доступ к его ячейкам для обновления, они равны нулю.

-(void)finishExam{

    for (int i = 0; i < [self.questionsOverviewCollection numberOfItemsInSection:0]; i++) {

        NSLog(@"self.questionsOverviewCollection - %@",self.questionsOverviewCollection);
        NSLog(@"cell - %@",[self.questionsOverviewCollection cellForItemAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0]]);
        NSLog(@"overviewCell - %@",(OverviewCell*)[self.questionsOverviewCollection cellForItemAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0]]);
        NSLog(@"numOfCells - %d", [self.questionsOverviewCollection numberOfItemsInSection:0]);

        OverviewCell *cell = (OverviewCell*)[self.questionsOverviewCollection cellForItemAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0]];
            [cell finishExam];
    }
}


- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{

    OverviewCell *cell = (OverviewCell*)[collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];

    [cell someSetUp];

    return cell;
}

Журнал:

self.questionsOverviewCollection - <UICollectionView: 0xa1abc00; frame = (14 219; 217 441); clipsToBounds = YES; opaque = NO; autoresize = W+H; gestureRecognizers = <NSArray: 0xe0617a0>; layer = <CALayer: 0xe0bbb00>; contentOffset: {0, 0}> collection view layout: <UICollectionViewFlowLayout: 0xe0cc3f0>
cell - (null)
overviewCell - (null)
numOfCells - 30
28
Luda 4 Апр 2014 в 15:39
Вы получаете всю ячейку нулевой или получаете какую-то ячейку, а после этого получаете нуль?
 – 
CRDave
4 Апр 2014 в 15:45
Хотя ответы здесь работают, если вы можете, лучше вызывать [cell finishExam] непосредственно в вашей модели данных, а не проксировать через collectionView. Смотрите мой комментарий к ответу Пола С. В большинстве случаев вы должны иметь возможность получить информацию о макете ячейки из свойства collectionViewLayout, а специфичные для модели функции, такие как - finishExam, должны быть доступны в вашей модели или настроены, когда ячейка исключена из очереди.
 – 
nteissler
16 Дек 2019 в 19:17

2 ответа

Лучший ответ

Из Документы UICollectionView (выделено мной)

Возвращаемое значение
Объект ячейки по соответствующему пути индекса или nil, если ячейка не отображается или indexPath вне допустимого диапазона.

Вы должны обновить свою базовую модель, которая предоставляет данные представлениям.

54
Paul.s 4 Апр 2014 в 15:46
10
Это сработало для меня, но в дополнение к перезагрузке данных с помощью [view reloadData] мне также пришлось [view layoutIfNeeded] согласно stackoverflow. com/a/21480786/1388195
 – 
zyzof
24 Сен 2014 в 09:24
28
Вызов [collectionView layoutIfNeeded] помог мне получить ячейку после вызова [collectionView reloadData]. Спасибо @zyzof
 – 
Richard McCluskey
19 Фев 2016 в 01:49
3
Всем спасибо за расклад IfNeeded!!! :D Просто интересно, кто-нибудь знает почему? Потому что в моем случае ячейка была видна все время.
 – 
Happiehappie
14 Июн 2016 в 11:59
1
Эй, @RichardMcCluskey, ты знаешь, почему мы должны назвать это? Я заметил, что все UICollectionViews отображаются правильно, но на самом деле без этой строки вызова cellForItemAtIndexPath все время возвращает nil!
 – 
Yuchen
2 Фев 2017 в 22:26
1
Привет @zyzof, ты должен опубликовать свое предложение как отдельный ответ!! Это отлично работает для меня!
 – 
Yuchen
3 Фев 2017 в 17:53

Попробуй это:

[collectionView reloadData];
[collectionView layoutIfNeeded];
18
zyzof 5 Фев 2017 в 08:29