UICollectionView
をサブクラス化し、そのdataSource
を処理しています。私はdataSource
をself
に、CollectionViewのinit
フェーズ中に割り当てます。CollectionView dataSourceはUICollectionViewControllerを使用しても機能しませんが、CollectionViewでUIViewControllerを使用すると機能します
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
方法(numberOfItemsInSection
とcellForItemAt
が正しく呼び出され - ケース2:私は
CollectionViewSubclass
UICollectionViewController
の内側を使用何らかの理由でdataSource
メソッドは呼び出されませんでしたが、デバッグしたときにinit(coder:)
が実際に呼び出され、dataSource = self
が実行されたことが確認されましたが、何とかしてdataSourceがnil
したがって、dataSource
メソッドは呼び出されていません。
私はその周りに頭を上げることができず、私はデバッグしようとしましたが、役に立たなかった。理由を教えてくれたり、デバッグのアイディアを教えてくれれば助かります。ありがとう!
編集:私はinit
ステージの後dataSource = self
を割り当てると、すべてがうまく動作します。しかし、私はむしろinit
フェーズでそれをやります。どうすればinit
の間に動作させることができますか? UICollectionViewConrtoller
docsから
文書の中で非常に良いキャッチです。私は上記のように私のカスタムcollectionViewにdataSourceを割り当てています。私は何が欠けていますか?私は間違った場所でそれをやっていると思いますか?私はそれが動作するようにinitの段階でどこで行うことができますか?私が後の段階で割り当てを行うとうまくいくのは当然ですが、initフェーズでデータソースを割り当てたいと思います。 –
'UICollectionViewConrtoller'を使用するとどうなりますか:** 1. ** View Controllerは初期化されます。 ** 2。**あなたのカスタムコレクションビューは初期化されています(この時点で 'dataSource'はコレクションビューです。** 3。**コレクションビューがビューコントローラに割り当てられています - この時点でビューコントローラは' dataSource'を引き継ぎます。 – njuri
私はinitステージでデータソースを割り当てたいと思っていますが、それは自分自身を構成するビューを持つのは良い習慣ではなく、メインビューのタスクは*情報を表示してユーザーイベントを送信することです。 - ビューの構成とデリゲートおよび/またはデータソースとなる – njuri