Ошибка утверждения UICollectionView для устаревших данных
Во время попытки выгрузить одну партию изображений из моего вида коллекции и затем заменить их на другую партию, я столкнулся с ошибкой, где, в зависимости от того, была ли оригинальная или последующая группа изображений более или менее, чем предполагаемая замена, возникает ошибка утверждения, которая гласит:
*** Assertion failure in -[UICollectionViewData validateLayoutInRect:], /SourceCache/UIKit_Sim/UIKit-2891.1/UICollectionViewData.m:341 *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UICollectionView recieved layout attributes for a cell with an index path that does not exist: {length = 2, path = 0 - 2}
В этом случае существующий список отсчетов изображений составлял 5, а новый список отсчетов составлял 2. Таким образом, когда он попал на третье изображение – произошло исключение – это указывает на то, что пользовательский интерфейс CollectionViewDataDelegate не знал об изменении streamа данных ,
Любые предложения о том, как убедиться, что новые изображения будут ссылаться на UICollectionView? Конечно, я назвал reloadData …
- Замена на устаревший размерWithFont: в iOS 7?
- Как настроить UITextView на его содержимое на iOS 7?
- Проблема автосохранения кадра UICollectionViewCell contentView в ячейке прототипа Storyboard (Xcode 6, iOS 8 SDK) происходит при запуске только на iOS 7
- Есть ли способ с момента выхода iOS 7 для получения UDID без использования iTunes на ПК / Mac?
- Не удается скрыть строку состояния в iOS7
спасибо
- Прокрутка Не работает IOS 7
- UIScrollView не прокручивается после обновления до iOS7 / xcode 5
- iOS 7 iPad Safari Пейзаж innerHeight / внешний дизайн макета
- Исходное местоположение Услуги, не работающие в iOS 7
- Как найти размер файла перед загрузкой его в iOS 7?
- Показать / скрыть UIToolbar, «перемещать пальцы», точно так же, как, например, в iOS7 Safari
- Как нарисовать линию в Sprite-kit
- UIBarButtonItem с пользовательским представлением, не правильно выровненным на iOS 7 при использовании в качестве элементов панели навигации влево или вправо
Я столкнулся с той же проблемой. Код работает под 6.1 и падает до 7.0. Я решил проблему следующим образом:
В функции
-(NSInteger) numberOfSectionsInCollectionView:(UICollectionView *)collectionView
Я звоню
[myCollectionView.collectionViewLayout invalidateLayout];
Это все.
И Доминик Сандер, и пользователь 1544494 являются правильными, и их решения хороши.
К сожалению, я заметил, что если вы установите minimumLineSpacingForSectionAtIndex
или minimumInteritemSpacingForSectionAtIndex
, внешний вид вашей коллекции будет minimumInteritemSpacingForSectionAtIndex
(рано или поздно).
Включение invalidateLayout
в viewWillLayoutSubviews
отвечает на этот вопрос и помогает сохранить внешний вид viewCollection.
- (void)viewWillLayoutSubviews { [super viewWillLayoutSubviews]; [viewCollection.collectionViewLayout invalidateLayout]; }
С iOS 10 и 11 это помогает:
collectionView.reloadData() collectionView.collectionViewLayout.invalidateLayout()
Недопустимый макет должен быть ПОСЛЕ перезагрузки данных.
Это просто. Точно так же, как приговор.
'UICollectionView recieved layout attributes for a cell with an index path that does not exist: {length = 2, path = 0 - 2}
Это означает, что на dataSouce нет indexPath (0,2). Но ваш UICollectionViewLayout возвращает UICollectionViewLayoutAttributes для indexPath (0,2).
Вы должны вернуть UICollectionViewLayoutAttributes только только в dataSouce.
Я думаю, что он был изменен с iOS7.
Моя проблема заключалась в том, что у меня было два UICollectionViews
внутри одного UIViewController
. И у меня были оба UICollectionViews
подключенные к UICollectionViewLayout
подclassу UICollectionViewLayout
. Я исправил эту проблему, изменив каждый UICollectionView
на свой собственный подclass UICollectionViewLayout
.
Источник: этот вопрос
Я исправил эту ошибку, обновив исходный источник данных коллекции:
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { [collectionView.collectionViewLayout invalidateLayout]; return collectionArray.count; }
У меня был такой же крах.
В моем приложении проблема заключалась в том, что я не очистил массив с помощью UICollectionViewLayoutAttributes. Я использую его в методе prepareLayout () для хранения атрибута layout для каждой ячейки.
var itemAttributes: Array
С помощью self.itemAttributes.removeAll()
в первой строке prepareLayout он работает.
Я испытал эту проблему после изменения содержимого коллекции. Решение, которое работало в моем случае, заключалось в недействительности макета после перезагрузки. Выполнение этого перед перезагрузкой не будет работать.
[collectionView reloadData]; //forces the layout attributes to be recalculated for new data [collectionView.collectionViewLayout invalidateLayout];
Решение, которое я нашел, состояло в том, чтобы гарантировать, что indexPath
я создавал в layoutAttributesForElementsInRect(rect: CGRect) -> [AnyObject]?
метод действителен для строки. Раньше я использовал (где i
– мой счетчик циклов):
var indexPath = NSIndexPath(index: i) var attributes = UICollectionViewLayoutAttributes(forCellWithIndexPath: indexPath)
Но обновив его, чтобы использовать следующее, он решил:
var indexPath = NSIndexPath(forRow: i, inSection: 0)! var attributes = UICollectionViewLayoutAttributes(forCellWithIndexPath: indexPath)
Я смог решить эту проблему, создав подclass UICollectionViewFlowLayout
и переопределив этот метод, чтобы вернуть YES
:
- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds { return YES; }
Я столкнулся с этой проблемой, и это было довольно неприятно. Мое решение – забыть о UICollectionViewController
и использовать вместо этого обычный UIViewController
с UICollectionView
внутри.
Убедитесь, что вы обновили contentSize
вашего collectionViewLayout
. Поэтому после получения новых изображений (2 вместо 5) пересчитайте contentSize
и установите его.
У меня тоже была эта ошибка, и я нашел обходной путь. Для меня UICollectionView запускал это под iOS 7, отлично работая на iOS 8.
Проверьте эту статью: Что вызывает эту ошибку iOS? UICollectionView получил атрибуты макета для ячейки с указательным путем, который не существует
В 2 словах: Авто-макет. Отключите его в представлении, содержащем UICollectionView, и для меня это сработало.
CollectionViewLayout кэширует атрибуты макета. Вполне возможно. Создайте новый экземпляр collectionViewLayout и назначьте его в collectionview.collectionViewLayout Таким образом, все кешированные атрибуты будут очищены до перезагрузки. Проблема может быть решена. Работала для меня, особенно когда вы используете другие библиотеки collectionViewLayout.
У меня была аналогичная проблема (с использованием Swift2.0, XCode 7).
Приложение разбилось с UICollectionView received layout attributes for a cell with an index path that does not exist
…
В моем случае, поскольку я использовал раскадровку, оказалось, что я забыл подключить IBOutlet, который был определен в моем диспетчере viewController с фактическим элементом коллекции, определенным в раскадровке. Подключение двух исправлено.
Я понял это. Если вы используете nib / xib для организации UITableViewCell
и вложенного UICollectionView
, вы можете избежать этой ошибки, переопределив этот метод.
- (void)prepareForReuse { [super prepareForReuse]; [self.collectionView.collectionViewLayout invalidateLayout]; }
Надеюсь, поможет.
Это означает, что на dataSouce нет indexPath (0,2). Но ваш UICollectionViewLayout возвращает UICollectionViewLayoutAttributes для indexPath (0,2). По TopChul
Это верно! Для меня проблема возникла из-за того, что я использовал один и тот же макет коллекции (экземпляр) для двух коллекций! Так что макет путается между двумя коллекциями View.
Он отлично работает после того, как я использую разную компоновку между различными видами коллекции.
Я столкнулся с чем-то похожим при попытке дублировать представление коллекции в другой раскадровки.
‘UICollectionView получил атрибуты макета для ячейки с отсутствием пути указателя: {length = 2, path = 1 – 0}’
Сначала я ищу быстрое решение. Протестированные копии вставляют различные ответы StackOverflow.
Но я написал свой собственный class макета. Поэтому я стараюсь отлаживать незаметно, это может быть моя реализация виновата, не так ли? Найдено, что метод numberOfSections
никогда не вызывался. В представлении коллекции предполагалось, что он имеет только одну секцию.
Затем я обнаружил, что class controllerа classов забыл соответствовать UICollectionViewDataSource
. Хотя dataSource был подключен в раскадровке, но, вероятно, class controllerа представления будет downcast, например, if let ds = dataSource as? UICollectionViewDataSource {ds.numberOfSections...}
if let ds = dataSource as? UICollectionViewDataSource {ds.numberOfSections...}
, который будет терпеть неудачу.
Поэтому я добавил соответствие UICollectionViewDataSource
и все работает отлично. Мое предположение может быть неточным. Но урок есть всякий раз, когда есть ошибка, с которой вы не знакомы, успокоиться и понять ее. UICollectionView получил атрибуты макета для ячейки с отсутствием указательного пути , это означает, что именно это говорит. Не так ли? Не пытайтесь найти серебряную пулю, как и многие из ответов здесь. Они все здорово, но ваш код – настоящее место битвы.
Я сталкиваюсь с той же проблемой, когда я использую UICollectionViewFlowLayout
как CollectionView's collectionViewLayout
.
viewController
родительский viewController
реализованный UICollectionViewDelegateFlowLayout
и назначьте его, поскольку делегат collectionView
может решить эту проблему.
Hollo, у меня такая же проблема, в то время как вставка коллекцииView в другую коллекциюView и reloadData в основной очереди. Наконец, я reloadData перед новым преобразованием данных в collectionView.
dispatch_async(dispatch_get_main_queue(), ^{ [_collectionView reloadData]; }); _notes = notes; [_collectionView reloadData];