2017-04-14 2 views
2

UICollectionViewをサブクラス化し、そのdataSourceを処理しています。私はdataSourceselfに、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:私はCollectionViewSubclassUIViewControllerの内側を使用する場合、すべてがうまく機能し、両方dataSource方法(numberOfItemsInSectioncellForItemAtが正しく呼び出され
  • ケース2:私はCollectionViewSubclassUICollectionViewControllerの内側を使用何らかの理由でdataSourceメソッドは呼び出されませんでしたが、デバッグしたときにinit(coder:)が実際に呼び出され、dataSource = selfが実行されたことが確認されましたが、何とかしてdataSourceがnilしたがって、dataSourceメソッドは呼び出されていません。

私はその周りに頭を上げることができず、私はデバッグしようとしましたが、役に立たなかった。理由を教えてくれたり、デバッグのアイディアを教えてくれれば助かります。ありがとう!

編集:私はinitステージの後dataSource = selfを割り当てると、すべてがうまく動作します。しかし、私はむしろinitフェーズでそれをやります。どうすればinitの間に動作させることができますか? UICollectionViewConrtollerdocsから

答えて

1

、コレクションビューのデータソースとデリゲートオブジェクトをストーリーボードまたはニブファイルからコレクションビューをロードするnibファイルから得られます。データソースまたはデリゲートが指定されていない場合、コレクションビューコントローラは、を不特定のロールに割り当てます。

UICollectionViewConrtollerを使用する場合は、カスタムコレクションビューにdataSourceを再割り当てする必要があります。

+0

文書の中で非常に良いキャッチです。私は上記のように私のカスタムcollectionViewにdataSourceを割り当てています。私は何が欠けていますか?私は間違った場所でそれをやっていると思いますか?私はそれが動作するようにinitの段階でどこで行うことができますか?私が後の段階で割り当てを行うとうまくいくのは当然ですが、initフェーズでデータソースを割り当てたいと思います。 –

+0

'UICollectionViewConrtoller'を使用するとどうなりますか:** 1. ** View Controllerは初期化されます。 ** 2。**あなたのカスタムコレクションビューは初期化されています(この時点で 'dataSource'はコレクションビューです。** 3。**コレクションビューがビューコントローラに割り当てられています - この時点でビューコントローラは' dataSource'を引き継ぎます。 – njuri

+0

私はinitステージでデータソースを割り当てたいと思っていますが、それは自分自身を構成するビューを持つのは良い習慣ではなく、メインビューのタスクは*情報を表示してユーザーイベントを送信することです。 - ビューの構成とデリゲートおよび/またはデータソースとなる – njuri

関連する問題