我在视图控制器中有一个tableview和collectionview。根据表视图中的选择填充集合视图。我希望在没有动画的情况下更新collectionview。在表上进行选择时,集合视图会更新。我也使用自定义的collectionview布局(UICollectionViewLayout)。这是更新集合视图的代码:
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
guard var data = measurementData?[indexPath.item] else { return }
if data.name != unitData.selectedMeasurement {
unitData.selectedMeasurement = data.name
unitConversionTable?.collectionViewLayout.invalidateLayout()
//self.unitConversionTable?.reloadData()
UIView.performWithoutAnimation({ self.unitConversionTable?.reloadSections(NSIndexSet(index: 0)) })
}
}
问题是如果整个集合视图不适合屏幕,应用程序崩溃;除非我使用reloadData()(附带不需要的动画)。这是实际的信息。
2016-04-13 22:42:23.367 aio Calculator [6288:273528] *断言 失败 - [UICollectionViewData layoutAttributesForItemAtIndexPath:] /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3512.60.7/UICollectionViewData.m:666 2016-04-13 22:42:23.978 xxx [6288:273528] *由于终止应用程序 未捕获的异常'NSInternalInconsistencyException',原因:'不 UICollectionViewLayoutAttributes实例 -layoutAttributesForItemAtIndexPath:{length = 2,path = 0 - 10}'
这个特殊情况在CV中有12个单元格。但是根据layoutAttributesForElementsInRect的结果只显示10个(因为只有10个适合)。
override func layoutAttributesForElementsInRect(rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
var layoutAttributes = [UICollectionViewLayoutAttributes]()
cache.forEach({attributes in
if CGRectIntersectsRect(attributes.frame, rect) {
layoutAttributes.append(attributes)
}
})
print("layoutAttributesForElementsInRect \(rect) has \(layoutAttributes.count) attributes")
return layoutAttributes }
我的打印陈述显示有12个项目。
prepareLayout NumOfitems:12
但只有10个属性。
layoutAttributesForElementsInRect(0.0,0.0,414.0,736.0)有10个 属性
所以,一切似乎都是正确的;至少据我所知,它是如何工作的。
为什么应用程序崩溃?
我错过了什么?
谢谢!
================== 更新:
行。我想我知道发生了什么事。我重新阅读了所有文档。 layoutAttributesForElementsInRect(rect:CGRect)的定义明确指出:
返回指定矩形中所有单元格和视图的布局属性。
但后来我开始查看示例项目并找到了 Collection View Transition清楚地返回所有缓存的属性,而不仅仅是与给定rect相交的属性。我更改了layoutAttributesForElementsInRect以返回所有缓存的属性,现在一切正常。