当被称为“太早”时,UICollectionViewFlowLayout的layoutAttributesForItemAtIndexPath返回nil

时间:2013-06-24 14:51:19

标签: objective-c uicollectionview uicollectionviewlayout

我的设置: 具有流布局的标准UICollectionView; datasource设置为我的控制器。 布局在xib文件中照常配置。 当我尝试通过layoutAttributesForItemAtIndexPath:在Controller的viewDidLoad方法中访问单元格的布局属性时,如下所示:

NSLog(@"LayoutAttribute: %@", [self.collectionView.collectionViewLayout layoutAttributesForItemAtIndexPath: [NSIndexPath indexPathForRow:0 inSection:0]]);

输出

"LayoutAttribute: (null)"

即使布局具有为我提供正确布局属性所需的所有信息。 它仍然无法在viewWillAppear:中工作,但它“神奇地”开始在viewDidAppear中工作:

"LayoutAttribute: <UICollectionViewLayoutAttributes: 0x8c4f710> index path: (<NSIndexPath 0x8c48be0> 2 indexes [0, 0]); frame = (0 0; 50 50);"

我发现了一种让它起作用的奇怪方法;我只是在请求布局属性之前访问collectionViewContentSize:

NSLog(@"Layout content size: %@", NSStringFromCGSize(self.collectionView.collectionViewLayout.collectionViewContentSize));    
NSLog(@"LayoutAttribute: %@", [self.collectionView.collectionViewLayout layoutAttributesForItemAtIndexPath: [NSIndexPath indexPathForRow:0 inSection:0]]);

正如预期的那样,输出是:

"Layout content size: {768, 50}"
"LayoutAttribute: <UICollectionViewLayoutAttributes: 0x8c4f710> index path: (<NSIndexPath 0x8c48be0> 2 indexes [0, 0]); frame = (0 0; 50 50);"

这里发生了什么?我假设访问内容大小触发了布局中的某些内容,但有人知道是否有正确的方法来执行此操作?或者这只是一个烦人的错误?

1 个答案:

答案 0 :(得分:0)

layoutAttributesForItemAtIndexPath:的文档说,如果该索引路径中没有项目,它只会返回nil。在致电reloadData之前,您是否未在集合视图上致电layoutAttributesForItemAtIndexPath:

另一个常见问题是调用链中的某个中间对象是nil。也许collectionView或collectionView.collectionViewLayout是nil