CollectionView dataSource не работает при использовании UICollectionViewController, но работает при использовании UIViewController с CollectionView

Я подклассифицирую UICollectionView и забочусь о его dataSource . Я назначаю dataSource для self во время фазы init CollectionView.

 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 , все работает хорошо, и оба метода numberOfItemsInSection ( numberOfItemsInSection и cellForItemAt правильно.
  • case 2: когда я использую CollectionViewSubclass внутри UICollectionViewController , по какой-то причине методы dataSource не вызывают, хотя, когда я отлаживался, я проверял, что init(coder:) был действительно вызван, а dataSource = self был выполнен. Но кажется, что каким-то образом dataSource снова получил нуль на более позднем этапе, поэтому методы dataSource не вызываются.

Я не могу обойти это, и я попытался отладить, но безрезультатно. Любая помощь, чтобы рассказать мне причину, или дать мне идеи для отладки, которые ценятся. Благодаря!

Edit : Когда я назначаю dataSource = self после этапа init , все работает хорошо. Но я предпочел бы сделать это на этапе init . Как я могу заставить его работать во время init ?

Solutions Collecting From Web of "CollectionView dataSource не работает при использовании UICollectionViewController, но работает при использовании UIViewController с CollectionView"

Из документов UICollectionViewConrtoller :

При загрузке представления коллекции из файла раскадровки или nib, источник данных и объекты-делегаты для представления коллекции получаются из файла nib. Если источник данных или делегат не указан, контроллер представления коллекции присваивает себя неопределенной роли.

Поэтому, если вы используете UICollectionViewConrtoller вам необходимо переназначить dataSource для своего пользовательского набора.