Ошибка утверждения 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 …

спасибо

Я столкнулся с той же проблемой. Код работает под 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 = 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]; 
  • Переполнение кнопки навигации iOS7
  • Как обнаружить разрешение на вход микрофона, отклоненное в iOS 7
  • Интерфейс пользовательского интерфейса iOS 7
  • UILabel и NSLinkAttributeName: ссылка не доступна для кликов
  • Как остановить нежелательную анимацию UIButton при изменении названия?
  • Исправлено фоновое изображение с ios7
  • UIStatusBarStyle PreferredStatusBarStyle не работает на iOS 7
  • UITableViewCell с высотой UITextView в iOS 7?
  • Почему мой коллега MCSession отключается случайно?
  • Установка изображения UIButton приводит к синей кнопке в iOS 7
  • ITunes обзор URL и iOS 7 (попросите пользователей оценить наше приложение) AppStore показать пустую страницу
  • Давайте будем гением компьютера.