UICollectionView не загружает ячейки

Вот код cellForItemAtIndexPath, который у меня есть:

    static NSString *cellIdentifier = @"Cell";
    MyCustomCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];
    //do stuff, set label text

if (indexPath.section == 0) cell.label.text = [words1 objectAtIndex:indexPath.row];
else if (indexPath.section == 1) cell.label.text = [words2 objectAtIndex:indexPath.row];
else if (indexPath.section == 2) cell.label.text = [words3 objectAtIndex:indexPath.row];

    return cell;

Прописываю тип ячейки в viewDidLoad:

[_collectionView registerClass:[MyCustomCell class] forCellWithReuseIdentifier:@"Cell"];

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

Теперь моя проблема... У меня есть два подхода, оба с проблемами. У меня есть 3 раздела, каждый рисунок из уникального массива данных.

  1. После того, как я получил необходимые данные, я использую [_collectionView reloadData]. Это загружает правильное количество ячеек в соответствии с количеством массивов, но ячейки вне экрана не заполняются. Поэтому, когда я прокручиваю их на экране, у них нет установленной метки.

  2. Вместо вышеперечисленного я пытаюсь перезагружать каждый раздел по мере извлечения данных (предпочтительный маршрут), используя следующий код (один раз для каждого раздела):

    [self.collectionView performBatchUpdates:^{ [self.collectionView reloadSections:[NSIndexSet indexSetWithIndex:0]]; } completion:nil];

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

В обоих сценариях, если я прокручиваю незагружаемые ячейки на экране, за его пределами и снова, они загружаются. Но в первый раз, когда вы видите их, они не делают.


person Josh Kahane    schedule 13.08.2015    source источник
comment
Этот код говорит, что нужно установить метку только для первых 3 ячеек данного раздела, поэтому ваша проблема заключается в cellForRowAtIndexPath. Вероятно, вы имели в виду indexPath.section == 0 {cell.label.text = @text}   -  person DBoyer    schedule 13.08.2015
comment
1. else if (indexPath.row == 2) cell.label.text = @text here;. Итак, строка 4 не имеет метки.   -  person tuledev    schedule 13.08.2015
comment
Попробуйте создать массив с NSString для всех имеющихся у вас ячеек. Как видите, ячейка для 4 строки не будет отображать текст. И этот код будет работать для всех ваших разделов (вы не проверяете раздел для ячейки)   -  person Bogdan Matveev    schedule 13.08.2015
comment
Упс! Я был большим тупым тупицей и неправильно печатал. Мозг включён, смотрите мой исправленный код. Я устанавливал текст из массивов в соответствии с разделом. Извини за это.   -  person Josh Kahane    schedule 13.08.2015
comment
Вы можете загрузить свой проект на github?   -  person Andriy Gordiychuk    schedule 13.08.2015


Ответы (1)


Решено. Размещение кода пользовательского интерфейса, например, создание UILabel (не nil) внутри метода layoutSubviews — это плохо.

Перемещение этого кода в метод init в моем пользовательском подклассе UICollectionViewCell устранило мою проблему, если пользовательский интерфейс ячейки не был последовательным.

person Josh Kahane    schedule 13.08.2015