UICollectionView Crash layoutAttributesForElementsInRect

时间:2016-04-14 18:55:49

标签: uicollectionview

我在视图控制器中有一个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以返回所有缓存的属性,现在一切正常。

0 个答案:

没有答案