2016-10-05 2 views
31

Запуска моего приложения в устройстве с прошивкой 10 я получаю эту ошибку:IOS 10 ошибки: UICollectionView получил расположение атрибутов для элемента с путем индекса, который не существует

UICollectionView получил расположение атрибутов для ячейки с индексный путь, который не существует

В iOS 8 и 9 работает нормально. Я исследовал, и я обнаружил, что это связано с недействительностью макета представления коллекции. Я попытался реализовать это решение без успеха, поэтому я хотел бы попросить о прямой помощи. Это моя точка зрения иерархии:

->Table view 
    ->Each cell of table is a custom collection view [GitHub Repo][1] 
     ->Each item of collection view has another collection view 

То, что я пытался это вставить

[self.collectionView.collectionViewLayout invalidateLayout]; 

В

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView 

обоих взглядов коллекции.

Кроме того, я попытался аннулировать макет, прежде чем делать перезагрузку данных, не работает ...

Может кто-нибудь дать мне несколько направлений, чтобы взять?

ответ

72

Это случилось со мной, когда число ячеек в collectionView изменилось. Оказывается, мне не хватало invalidateLayout после вызова reloadData. После добавления, я больше не испытывал сбоев. Apple внесла некоторые изменения в collectionViews в iOS10. Думаю, именно по этой причине мы не испытываем такой же проблемы в более старых версиях.

Вот мой окончательный код:

[self.collectionView reloadData]; 
[self.collectionView.collectionViewLayout invalidateLayout]; 
+2

Это помогло, спасибо. Но кто-нибудь знает, почему это помогает? –

+0

Отличный ответ, решена проблема, с которой я сталкивался некоторое время с новым приложением iOS 10 с использованием представлений коллекции. Хотелось бы знать, почему это требуется, хотя –

+0

Он работает, когда количество строк коллекции увеличивается. Но снова падает, когда количество строк уменьшается (т. Е. Работает отлично, когда 5 столбцов до 10 столбцов, но сбой при 10 столбцах до 5 столбцов). –

4

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

UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init]; 
layout.estimatedItemSize = CGSizeMake(60, 25); 
layout.itemSize = UICollectionViewFlowLayoutAutomaticSize;    
self.collectionView.collectionViewLayout = layout; 

Я решить эту проблемы, заменив

[self.collectionView reloadData]; 

в

[self.collectionView reloadSections:indexSet]; 
+0

это решило это для меня – Josh

11

Я также столкнулся этот вопрос с 2 collectionViews в ту же точку зрения, потому что я добавил тот же UICollectionViewFlowLayout в обеих коллекциях:

let layout = UICollectionViewFlowLayout() 
collectionView1.collectionViewLayout = layout 
collectionView2.collectionViewLayout = layout 

Конечно, он падает при перезагрузке данных, если CollectionView1 Data change. Если это может помочь кому-то.

+0

Спасибо, Его работы для меня. Я застрял в нем несколько дней. Вы удивительны :) –

+0

Эй, у меня есть некоторые проблемы. У меня есть два вида коллекции. Один из них - cltnTools, а другой - cltnEdits. cltnEdits появляется всякий раз, когда пользователь нажимает на любую ячейку из cltnTools, с которой я сталкиваюсь с ошибкой: «UICollectionView получил атрибуты макета для ячейки с указательным путем, который не существует: {length = 2, path = 0 - 2} –

+0

, что проблема разрешается с помощью let layout = UICollectionViewFlowLayout() cltnEdits.collectionViewLayout = layout все работает, но мои ячейки cltnEdits прокручиваются по вертикали, но я хочу горизонтальную прокрутку для обоих моих коллекций, чтобы я написал этот макет строки .scrollDirection =. Horizontal для горизонтальной прокрутки, то я снова сталкиваюсь с этой ошибкой. мог бы помочь мне с этим? как я могу его решить. –

1

Это не лучшее время reloadData (вы должны использовать insertItems и deleteItems и даже reloadSections). Но ... после того, как о том, что в некоторых случаях это действительно так, вы можете сделать это:

collectionView.dataSource = nil 

collectionView.delegate = nil 

/*... All changes here. ... */ 

collectionView.dataSource = self 

collectionView.delegate = self 

collectionView.reloadData() 
+0

У меня такая же ошибка, и установка 'dataSource' и' delegate' '' nil' разрешила ошибку. В моем случае я использую 'UICollectionView' с двумя ** разными **' UICollectionViewLayout'ами, и я думаю, что процесс рециркуляции ** имеет проблемы с этим. Благодарю. –

1

Ответ @ Katrin помог много, но я мог бы достичь еще лучших результатов, добавив еще одну строку:

collectionView.reloadData() 
collectionView.collectionViewLayout.invalidateLayout() 
collectionView.layoutSubviews() // <-- here it is :) 

Я не могу сейчас сказать, могу ли я воспроизвести сбой этой линией или нет, но, я думаю, был один ...Итак, еще не серебряная пуля, но что-то.

+0

Спасибо вам большое! Меня устраивает. –

+0

это тоже работает для меня! Благодаря! – oskarko

+0

perfect..it works: D Спасибо !!! –

-1

Если вы хотите сохранить позицию прокрутки и исправить сбой, вы можете использовать это:

collectionView.reloadData() 
let context = collectionView.collectionViewLayout.invalidationContext(forBoundsChange: collectionView.bounds) 
context.contentOffsetAdjustment = CGPoint.zero 
collectionView.collectionViewLayout.invalidateLayout(with: context) 
+0

Почему мой ответ был проголосован? Я знаю, что это помогает –

7

Если у вас есть собственный макет, не забудьте очистить кэш (UICollectionViewLayoutAttributes), а перекрывая подготовить Func

override func prepare() { 
    cache.removeAll() 
+0

Решила мою проблему! Спасибо! – DaniSDE

+0

Помог мне с индивидуальной планировкой! Спасибо – Codenator81

+0

@ DaniSDE вы можете объяснить, как/где я буду использовать это? Спасибо – user6520705

0

У меня тоже была эта проблема. В моем случае пользовательский UICollectionViewLayout был применен к представлению коллекции &, проблема заключалась в том, что у него были устаревшие данные для количества ячеек, которые должны отображаться. Это определенно то, что вы можете проверить, когда вы видите UICollectionView received layout attributes for a cell with an index path that does not exist

1

В моем случае, я изменял NSlayoutConstraint постоянную

self.collectionViewContacts.collectionViewLayout.invalidateLayout() 

      UIView.animate(withDuration: 0.3) { 
       self.view.layoutIfNeeded() 
      } 


      self.collectionViewContacts.reloadData() 

решается вопрос

Смежные вопросы