UICollectionView.setContentOffset (...), вызывающий исключение NSRangeException - PullRequest
0 голосов
/ 06 февраля 2019

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

'NSRangeException', reason: '*** -[__NSArrayM objectAtIndexedSubscript:]: index 9223372036854775806 beyond bounds [0 .. 4]'

Это метод, вызывающий ошибку.

public func scrollTo(year: Int) {
    if let month = months.firstIndex(where: { $0.components.year == year }),
        let attributes = collectionView.layoutAttributesForSupplementaryElement(ofKind: UICollectionElementKindSectionHeader, at: IndexPath(item: 0, section: month)){
        let y = attributes.frame.origin.y - collectionView.contentInset.top

        // This is the line causing the error
        collectionView.setContentOffset(CGPoint(x: 0, y: y), animated: true)
    }
}

Я пытался распечатать вычисленное значение y, но оно было 0 при каждом сбое.

Возможно, стоит отметить, что индекс, упомянутый в исключении, равен Int.max - 1, хотя, учитывая, что y является CGFloat, я не уверен, насколько это актуально.

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Я не уверен, что анимация вызывала сбой, но изменение animated на false при вызове setContentOffset(...) решило проблему.

0 голосов
/ 06 февраля 2019

Почему бы вам не использовать этот встроенный метод экземпляра UICollectionView scrollToItem(at:at:animated:) с указанным вами индексным путем?

Прокручивает содержимое представления коллекции до тех пор, пока указанный элемент не станет видимым. из документов Apple

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...