使用setCollectionViewLayout会导致崩溃,说找不到layoutAttributesForItemAtIndexPath

时间:2016-02-15 22:01:03

标签: swift uicollectionview

我有一个集合视图,我必须动态更改集合视图的布局。在设置新布局时,应用程序与日志崩溃,

2016-02-15 13:47:31.663 PhotoBoard [92347:5235792] ***断言失败 - [UICollectionViewData layoutAttributesForItemAtIndexPath:],/ BuildRoot / Library / Cache / com.apple.xbs / Source / UIKit_Sim / UIKit -3512.30.14 / UICollectionViewData.m:666

2016-02-15 13:47:31.666 PhotoBoard [92347:5235792] *由于未捕获的异常终止应用程序' NSInternalInconsistencyException',原因:'没有用于-layoutAttributesForItemAtIndexPath的UICollectionViewLayoutAttributes实例:{length = 2,path = 0 - 0}' * 第一次抛出调用堆栈: (     0 CoreFoundation 0x000000010d94de65 __exceptionPreprocess + 165     1 libobjc.A.dylib 0x000000010f8b5deb objc_exception_throw + 48     2 CoreFoundation 0x000000010d94dcca + [NSException raise:format:arguments:] + 106     3基础0x000000010dfbe4de - [NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 198     4 UIKit 0x000000010ec4161c - [UICollectionViewData layoutAttributesForItemAtIndexPath:] + 627     5 UIKit 0x000000010ebeee24 - [UICollectionView _setCollectionViewLayout:animated:isInteractive:completion:] + 1606     6 UIKit 0x000000010ebee4db - [UICollectionView setCollectionViewLayout:] + 318

在打印布局属性时,我看到了一个布局属性项 layoutAttributesForItemAtIndexPath:{length = 2,path = 0 - 0}' ,我在布局中看到一个条目,所以不确定为什么找不到布局属性,

属性索引路径:({length = 2,path = 0 - 0}); frame =(6 293; 298 403.695);

属性索引路径:({length = 2,path = 0 - 1}); frame =(6 293; 298 408.695);

属性索引路径:({length = 2,path = 0 - 2}); frame =(6 293; 298 418.695);

属性索引路径:({length = 2,path = 0 - 3}); frame =(6 293; 298 433.695);

属性索引路径:({length = 2,path = 0 - 4}); frame =(6 293; 298 453.695);

属性索引路径:({length = 2,path = 0 - 5}); frame =(6 293; 298 478.695);

属性索引路径:({length = 2,path = 0 - 6}); frame =(6 293; 298 508.695);

属性索引路径:({length = 2,path = 0 - 7}); frame =(6 293; 298 543.695);

属性索引路径:({length = 2,path = 0 - 8}); frame =(6 293; 298 583.695);

属性索引路径:({length = 2,path = 0 - 9}); frame =(6 293; 298 628.695);

属性索引路径:({length = 2,path = 0 - 10}); frame =(6 293; 298 678.695);

属性索引路径:({length = 2,path = 0 - 11}); frame =(6 293; 298 733.695);

属性索引路径:({length = 2,path = 0 - 12}); frame =(6 293; 298 793.695);

属性索引路径:({length = 2,path = 0 - 13}); frame =(6 293; 298 858.695);

属性索引路径:({length = 2,path = 0 - 14}); frame =(6 293; 298 928.695);

属性索引路径:({length = 2,path = 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()

如果我静态加载两个自定义布局,它们可以正常工作,只有在动态更改布局时才会发生崩溃。

1 个答案:

答案 0 :(得分:3)

我遇到了同样的问题,这解决了我的问题。

如果要使用多个自定义布局进行切换,请在两个自定义布局类中重写以下方法,

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

Swift示例:

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

目标C的示例:

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

快乐编码..!