cellForItemAtIndexPath вызывается за пределами границ

У меня есть UICollectionView , который использует собственный класс UICollectionViewCell . Основная идея - представление коллекции будет перемещать каталоги и отображать фотографии, содержащиеся в каталоге (результаты через вызовы API). Контроллер начального представления отображает UICollectionView , а кратки на ячейках генерируют новое представление с новым UICollectionView . Содержимое каталога хранится в NSMutableDictionary с ключом каталога, являющимся ключом.

Проблема возникает, когда создается новый view/collectionview с довольно коротким списком фотографий - обычно меньше 30. Когда я поворачиваю устройство, просмотр коллекции пытается повторно отобразить, и приложение вылетает с «индексом X за пределами границы [0 .. Y] ", причем X является числом, большим Y (последний элемент массива).

Я заметил, что это происходит только тогда, когда вновь отображаемый вид коллекции имеет меньше элементов, чем просмотр коллекции «root».

Вот примеры соответствующих (некоторые из них, во всяком случае) кода:

- (NSInteger)collectionView:(UICollectionView *)view numberOfItemsInSection:(NSInteger)section {
    return [[photos objectForKey:api.directoryID] count];
}

- (NSInteger)numberOfSectionsInCollectionView: (UICollectionView *)collectionView {
    return 1;
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    PhotoCell *photoCell = [cv dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath];
    photoCell.photo = [[photos objectForKey:api.directoryID] objectAtIndex:indexPath.row];
    return photoCell;
}

По крайней мере, я хотел бы попробовать try/catch в cellForItemAtIndexPath , но не знаю, где бы я поставил try/catch. Возможно, в пользовательском UICollectionView ?

Благодаря!

4
nl ja de
Я бы начал с добавления операторов NSLog() в numberOfItemsInSection и в cellForItemAtIndexPath , чтобы проверить directoryID и значение [[photos objectForKey : api.directoryID] count] .
добавлено автор Martin R, источник
NSLog collectionView в методах. Настройка с более чем одним UICollectionView однажды укусила меня, так как я не отслеживал «правильный» просмотр коллекции и не работал на неправильном (это также давало мне «вне границ» ошибки ).
добавлено автор SAE, источник
вы пытались добавить точку останова исключения для ВСЕХ ИСКЛЮЧЕНИЙ? если проблема в вашем коде, он будет указывать соответствующую строку.
добавлено автор Yariv, источник
Да, я уже это сделал. А также напечатал indexPath.row для каждой ячейки. Он печатает обычные «1, 2, 3, 4, 5, 6 и т. Д.» До последнего элемента, а затем в конце выводит на экран дико вне границ.
добавлено автор pierceography, источник

1 ответы

Проблема здесь:

- (NSInteger)collectionView:(UICollectionView *)view numberOfItemsInSection:(NSInteger)section {
    return [[photos objectForKey:api.directoryID] count];
}

Я предполагаю, что для всех экземпляров UICollectionView вы используете один делегат и dataSource . Если это так, перепишите код таким образом:

- (NSInteger)collectionView:(UICollectionView *)view
         numberOfItemsInSection:(NSInteger)section
{
    if ( view == _firstCollectionView )
    {
        return [[photos objectForKey:api.directoryID] count];
    }
    else if ( view == _secondCollectionView )
    {
        return ...;
    }
}

Также вы должны переписать метод collectionView: cellForItemAtIndexPath: таким образом.

3
добавлено
Mobile Dev Jobs — вакансии и аналитика
Mobile Dev Jobs — вакансии и аналитика
6 187 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin и т.д. ВАЖНО: Правила публикации и правила канала: Ссылка – https://telegra.ph/Pravila-oformleniya-vakansij-i-rezyume-11-09-2

iOS Developers — русскоговорящее сообщество
iOS Developers — русскоговорящее сообщество
2 400 участник(ов)

Общаемся на темы, посвященным iOS-разработке, Swift, Objective-C, SDK, Rx, Cocoa и т.д.