2016-02-15 2 views
5

Я имею коллекцию просмотры, и я должен изменить макет вида коллекции, устанавливающий новую компоновку, сбой приложения с журналом dynamically.On,Использование setCollectionViewLayout приводит к сбою, говорит layoutAttributesForItemAtIndexPath не найден

2016 -02-15 13: 47: 31.663 PhotoBoard [92347: 5235792] *** Ошибка утверждения в - [UICollectionViewData layoutAttributesForItemAtIndexPath:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3512.30.14 /UICollectionViewData.m:666

2016-02-15 13: 47: 31.666 PhotoBoard [92347: 5235792] * Завершение приложения из-за неперехваченного исключения «NSInternalInconsistencyException», причина: нет экземпляра UICollectionViewLayoutAttributes для -layoutAttributesForItemAtIndexPath {длина = 2, путь = 0 - 0}» * Первого стек вызовов броска: ( 0 CoreFoundation 0x000000010d94de65 __exceptionPreprocess + 165 1 libobjc.A.dylib 0x000000010f8b5deb objc_exception_throw + 48 2 CoreFoundation 0x000000010d94dcca + [NSException поднимают: формат: аргументы:] + 106 3 Фундамент 0x000000010dfbe4de - [NSAssertionHandler handleFailureInMethod: объект: файл: LineNumber: описание:] + 198 4 UIKit 0x000000010ec4161c - [UICollectionViewData layoutAttributesForItemAtIndexPath:] + 627 5 UIKit 0x000000010ebeee24 - [UICollectionView _setCollectionViewLayout: анимированный: isInteractive: завершение:]6 UIKit 0x000000010ebee4db - [UICollectionView setCollectionViewLayout:] + 318

На печать макета атрибуты я вижу элемент атрибута один макет для layoutAttributesForItemAtIndexPath: {длина = 2, путь = 0 - 0}», я вижу запись в макет, поэтому не уверен, почему атрибут макета не найден,

Атрибут path path: ({length = 2, path = 0 - 0}); frame = (6 293; 298 403,695);

Путь указателей атрибутов: ({длина = 2, путь = 0 - 1}); frame = (6 293; 298 408,695);

Путь указателей атрибутов: ({длина = 2, путь = 0 - 2}); frame = (6 293; 298 418,695);

Путь указателей атрибутов: ({длина = 2, путь = 0 - 3}); frame = (6 293; 298 433,695);

Путь указателей атрибутов: ({длина = 2, путь = 0 - 4}); frame = (6 293; 298 453,695);

Путь указателей атрибутов: ({длина = 2, путь = 0 - 5}); frame = (6 293; 298 478,695);

Путь указателей атрибутов: ({длина = 2, путь = 0 - 6}); frame = (6 293; 298 508,695);

Путь указателей атрибутов: ({длина = 2, путь = 0 - 7}); frame = (6 293; 298 543,695);

Путь указателей атрибутов: ({длина = 2, путь = 0 - 8}); frame = (6 293; 298 583,695);

Путь указателей атрибутов: ({длина = 2, путь = 0 - 9}); frame = (6 293; 298 628,695);

Путь указателей атрибутов: ({длина = 2, путь = 0 - 10}); frame = (6 293; 298 678,695);

Путь указателей атрибутов: ({длина = 2, путь = 0 - 11}); frame = (6 293; 298 733.695);

Путь указателей атрибутов: ({длина = 2, путь = 0 - 12}); frame = (6 293; 298 793,695);

Путь указателей атрибутов: ({длина = 2, путь = 0 - 13}); frame = (6 293; 298 858,695);

Путь указателей атрибутов: ({длина = 2, путь = 0 - 14}); frame = (6 293; 298 928,695);

Путь указателей атрибутов: ({длина = 2, путь = 0 - 15}); frame = (6 293; 298 1003,69);

Это, как я устанавливаю новый пользовательский макет,

self.collectionView!.collectionViewLayout = self.stackLayout 
     self.stackLayout.delegate = self 
     self.collectionView!.collectionViewLayout.invalidateLayout() 
     self.collectionView!.setCollectionViewLayout(self.stackLayout, animated:true) 
     self.collectionView?.reloadData() 

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

+0

Пробовал использовать startInteractiveTransitionToCollectionViewLayout для перехода, эта же проблема происходит. –

+0

Я получаю то же самое. Я не могу найти код, откуда это происходит. Объяснение того, где искать и как исправить, было бы замечательно. – markhorrocks

ответ

3

У меня была такая же проблема, и это решает мою проблему.

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

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect 
- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath 

Пример для Swift:

override func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? { 
    return cache[indexPath.item] 
} 

Примера для Objective C:

- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return self.cache[indexPath.item]; 
} 

HAPPY CODING ..!

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