使用UICollectionViewController时CollectionView dataSource无法正常工作,但在将UIViewController与CollectionView

时间:2017-04-14 11:38:04

标签: ios swift uitableview uicollectionview

我正在继承UICollectionView,并负责dataSource。我在CollectionView的dataSource阶段将self分配给init

import Foundation
import UIKit

class CollectionViewSubclass: UICollectionView, UICollectionViewDataSource {

    public override init(frame: CGRect, collectionViewLayout layout: UICollectionViewLayout) {
        super.init(frame: frame, collectionViewLayout: layout)
        dataSource = self
    }

    public required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        dataSource = self
    }

    public func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        // This is called for the first case, but not the second

        return 1
    }

    public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        // This is called for the first case, but not the second

        return UICollectionViewCell()
    }
}
  • 案例1:当我在CollectionViewSubclass中使用UIViewController时,一切正常,并且dataSource方法(numberOfItemsInSectioncellForItemAt都被正确调用。
  • 案例2:当我在CollectionViewSubclass内使用UICollectionViewController时,由于某种原因未调用dataSource方法,但在我调试时,我检查了{{1}确实被称为init(coder:)被执行了。但似乎不知何故,dataSource在稍后阶段再次获得dataSource = self,因此未调用nil方法。

我无法理解这一点,我试图调试,但无济于事。任何帮助告诉我原因,或给我调试的想法,赞赏。谢谢!

修改:当我在dataSource阶段之后指定dataSource = self时,一切正常。但我宁愿在init阶段这样做。如何在init期间使其正常工作?

1 个答案:

答案 0 :(得分:1)

来自UICollectionViewConrtoller docs

  

从storyboard或nib文件加载集合视图时,将从nib文件中获取集合视图的数据源和委托对象。如果未指定数据源或委托,则集合视图控制器将自己分配给未指定的角色。

因此,如果您使用UICollectionViewConrtoller,则需要将dataSource重新分配到自定义集合视图。