美文网首页
iOS9 UIcollecionView crash 记录

iOS9 UIcollecionView crash 记录

作者: 派大星的博客 | 来源:发表于2018-05-28 19:46 被阅读11次
    private func buildCollectionView() {
        let layout = UICollectionViewFlowLayout()
        layout.scrollDirection = .horizontal
        layout.sectionInset = UIEdgeInsets(top: 0, left: 10, bottom: 0, right: 0)
        layout.minimumLineSpacing = 10
        layout.minimumInteritemSpacing = 10
        layout.itemSize = CGSize(width: 130, height: 176 )
        layout.headerReferenceSize = CGSize(width: 130 , height: 176)
        let cvFrame = CGRect(x: 0, y: 0, width: ScreenWidth, height: 176)
        collectionView = UICollectionView(frame: cvFrame, collectionViewLayout: layout)
        collectionView.dataSource = self
        collectionView.delegate = self
        
        collectionView.register(ProductCell.self, forCellWithReuseIdentifier: "cell")
        collectionView.register(TitleHeaderView.self, forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "Header")

        collectionView.contentInset = UIEdgeInsets(top: 0, left: 23, bottom: 0, right: 23)
        collectionView.showsHorizontalScrollIndicator = false
        addSubview(collectionView)
    }

UICollectionView的崩溃经常在Debug环境也无法定位,因为Xcode不能提示你正确的崩溃位置在哪?(通常在外部或者main方法)

  • 这里有个小的Tip:
    添加异常断点

    Add Exception Breakpoint.png
  • 加了Exception Breakpoint后,得到的信息如下


    iOS9 崩溃栈信息 和 汇编代码 .png
  • 导致崩溃的代码所在:

        layout.headerReferenceSize = CGSize(width: 130 , height: 176)
  • 原因:
    一般UICollectionView的数据由网络请求返回,通常做法是在viewDidLoad()内布局UICollectionView,并且发送网络请求,在网络请求回调时collectionView.reloadData()刷新数据,但是如果你的HeaderView也是在网络请求时返回,而非初始化就有。就会导致这个的崩溃!

即,给定了HeaderView的size,但是并没有返回headerView。ios9中这是个必然会Crash的Bug,在ios10以后的版本已经优化了,不会出现Crash。

  • 建议
    不要用layout.headerReferenceSize的方法返回HeaderViewSize,而是实现UICollectionViewDelegateFlowLayout这个协议中的方法,这样更灵活!

相关文章

网友评论

      本文标题:iOS9 UIcollecionView crash 记录

      本文链接:https://www.haomeiwen.com/subject/fefnjftx.html