当collectionview将可重用单元格出列时,延迟加载uicollectionview会导致应用程序崩溃

时间:2017-08-24 07:45:02

标签: ios swift uitableview

我的HomeHorizontalSpecialCell继承了UICollectionViewCell,并且有一个属性是collectionView。这个collectionView通过延迟加载构建

private lazy var _collectionView: UICollectionView! = {
   let layout = UICollectionViewFlowLayout()
   layout.scrollDirection = .horizontal
   layout.minimumLineSpacing = 10
   let itemWidth = (kScreenWidth - 4 * layout.minimumLineSpacing) / 3.4
   let itemHeight = itemWidth
   layout.itemSize = CGSize(width: itemWidth, height: itemHeight)
   let collectionView = UICollectionView(frame: CGRect(x: 0, y: 0, width: kScreenWidth, height: itemHeight), collectionViewLayout: layout)
   collectionView.delegate = self
   collectionView.dataSource = self
   collectionView.backgroundColor = UIColor.white
   collectionView.contentInset = UIEdgeInsetsMake(0, 7, 0, 7)
   // register cell
   collectionView.register(HomeHorizontalSpecialGoodCell.self, forCellWithReuseIdentifier: HomeHorizontalSpecialCell.reuseSpecialCellID)
   collectionView.showsHorizontalScrollIndicator = false
   self.contentView.addSubview(collectionView)
   return collectionView
    }()

当设置数据时,此collectionView调用reloadData方法并开始构造和注册单元格。     在dataSource方法中,我将这些注册的可重用单元格出列

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
   // crash at here on big size iPhone
   let specialGoodCell = collectionView.dequeueReusableCell(withReuseIdentifier: HomeHorizontalSpecialCell.reuseSpecialCellID, for: indexPath) as! HomeHorizontalSpecialGoodCell
   if indexPath.row != (_dataList?._item.count)! { // good cells
       specialGoodCell.goodModel = _dataList?._item[indexPath.row]
   } else { // last cell
       specialGoodCell.setMoreImage("spe_more")
   }
   return specialGoodCell
}

强制解包一个单元格导致应用程序崩溃当collectionView在一些大尺寸iPhone上出现一个单元格,但是小尺寸没有。 我发现第一次在大尺寸iPhone上直接初始HomeHorizontalSpecialCell的情况,但是在小尺寸时需要滚动collectionView来初始化这个单元格实例。

为什么在大尺寸iPhone上加载此单元时应用程序崩溃?

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

执行此操作的一种好方法是使用viewController作为collectionView的数据源和委托。也许这篇文章可以帮到你。 Putting a UICollectionView in a UITableViewCell in Swift