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

标签 swift uicollectionview

我有一个 Collection View ,我必须动态更改 Collection View 的布局。在设置新布局时,应用程序崩溃并显示日志,

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”而终止应用程序,原因:“-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 引发:格式:参数:] + 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});框架 = (6 293; 298 403.695);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

属性索引路径:( {length = 2, path = 0 - 15});框架 = (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()

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

最佳答案

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

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

 - (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];
}

编码愉快..!

关于swift - 使用 setCollectionViewLayout 导致崩溃,说找不到 layoutAttributesForItemAtIndexPath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35419903/

相关文章:

objective-c - 如何在iOS 6 的UICollectionView 中实现无限水平和垂直滚动?

swift - Uicollectionview 单元格未加载二进制数据

ios - Swift NSURLSession 真的真的真的很慢

swift - 泛型类型扩展上的无效重新声明编译器错误

ios - SwiftUI - 此代码是否实例化一个新的场景对象?

ios - UIViewController 的模式可以显示为 UITableViewController 或 UICollectionViewController

ios - 创建一个单元格高度大于 View 高度的水平 UICollectionView

ios - ReplayKit 的 RPSystemBroadcastPickerView 不显示 preferredExtension

swift - 在 Swift 中,没有办法获取返回函数的参数名称?

ios - Swift:使用 collectionView 创建 imageView 堆栈