NSArray не загружает все объекты в массиве?

В настоящее время я подклассифицирую UICollectionViewCell, и он загружает ячейки в массиве (ниже приведен код внутри collectionViewCell.m):

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {

        NSArray *cellArray = [[NSBundle mainBundle] loadNibNamed:@"insightCell" owner:self options:nil];
NSLog (@"NSArray cellArray %i", [cellArray count]);
 if ([cellArray count] < 1) {
            return nil;
        }
        if (![[cellArray objectAtIndex:0] isKindOfClass:[UICollectionViewCell class]]) {
            return nil;
        }
        self = [cellArray objectAtIndex:0];
 }
return self;

}

Все загружается нормально, и он отображает возвращаемое значение, которое у меня есть в моем методе - (NSInteger) collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section, равное 11. Но когда я регистрирую процесс инициации cellArray, это выглядит так:

Данные журнала приложений

Таким образом, массив ячеек подсчитывает, сколько раз массив добавляет ячейку, и по какой-то причине он достигает только 6. Странная вещь; все 11 элементов загружаются, но NSArray не регистрирует, что он загрузил все 11, он просто останавливается на 6, что раздражает... Я пробовал несколько разных способов исправить это, но они, похоже, не работают, и это сводя меня с ума! Я не думаю, что кто-то еще сталкивался с этой проблемой?

Я добавлю в свой код представления коллекции rootController.m на всякий случай, однако все это правильно соединяется, так что это не должно быть проблемой.

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

    insightCell *myCell = (insightCell *)[collectionView dequeueReusableCellWithReuseIdentifier:cellID forIndexPath:indexPath];

return myCell;
}

person Ollie177    schedule 19.11.2012    source источник
comment
Может быть, у вас есть только 6 ячеек, которые видны на вашем экране. А остальные будут сгенерированы, если вы начнете прокручивать.   -  person Dave    schedule 19.11.2012
comment
Да, я так и думал, но потом, когда я прокручиваю, эти ячейки все равно не добавляются в журнал. Это почти как если бы у меня было более 6 ячеек в UICollectionView, он не регистрируется, а затем дополнительные 5...   -  person Ollie177    schedule 19.11.2012
comment
Это именно то, что должен делать шаблон повторного использования ячеек. В памяти хранится не больше ячеек (типа/идентификатора повторного использования), так как они сразу видны на экране. Как только один из них полностью прокручивается, он становится доступным для повторного использования. Естественно, его метод initWithWhatever больше не вызывается, потому что он уже существует. Следовательно, вы не должны помещать какую-либо бизнес-логику в метод init. Подкласс методов layoutSubViews или cellForRowAtIndexPath для управления содержимым и зависящим от содержимого внешним видом.   -  person Hermann Klecker    schedule 19.11.2012
comment
Поскольку показанный код делает то, что он должен делать, чего вы хотите достичь? Почему вы ожидали другого поведения?   -  person Hermann Klecker    schedule 19.11.2012
comment
Я не уверен, я только начал использовать UICollectionViews и подключаться к веб-данным, поэтому раньше не сталкивался с такой проблемой. Наверное, я был немного наивен! Извинения!   -  person Ollie177    schedule 19.11.2012


Ответы (1)


Когда вы создаете ячейку с помощью dequeueReusableCellWithIdentifier, она будет повторно использовать ячейку с тем же идентификатором, который прокручивается с экрана. См. ссылку: Ссылка

Вы можете найти хорошую презентацию по теме в видеороликах WWDC 2012.

person Dave    schedule 19.11.2012
comment
Ааа, да, я вижу. Это раздражает. Спасибо что подметил это. Хорошо, есть ли способ обойти это? Способ просто добавить ячейки в массив, а не повторно использовать существующие ячейки? - person Ollie177; 19.11.2012
comment
Не используйте dequeueReusableCellWithIdentifier. Вместо этого используйте [[insightCell alloc] init]. Но это не очень хорошо для вас, потому что создает ненужные ячейки. В чем проблема с резюмом? - person Dave; 19.11.2012
comment
Ну, я использую данные сервера. Итак, у меня есть данные на сервере, которые содержатся в элементах с идентификатором. эти идентификаторы должны были быть назначены ячейкам, чтобы каждая ячейка содержала данные, соответствующие идентификатору с сервера, конечный результат будет отображать изображения, которые являются частью данных элементов сервера. Повторное использование ячейки означает, что я получаю первые 6 элементов с их изображениями в порядке, но остальные 5 не отображаются. - person Ollie177; 19.11.2012