簡體   English   中英

CollectionViewCell 中 CollectionView 的數據源始終為零

[英]Data Source for CollectionView inside CollectionViewCell is always nil

我在UICollectionView有一個UICollectionViewCell ,還有一個單獨的NSObject ,它是dataSource 我可以為外部UICollectionView設置dataSource UICollectionView ,但不能為內部設置dataSource UICollectionView

這是包含內部UICollectionView的單元格:

class FeaturedCell: UICollectionViewCell, UICollectionViewDelegate {

    @IBOutlet var collectionView: UICollectionView!
    let data = FeaturedData()

    override init(frame: CGRect) {
        super.init(frame: frame)
        //setUp()
    }

    required init?(coder: NSCoder) {
        super.init(coder: coder)
    }

    func setUp() {
        collectionView.dataSource = data
        collectionView.delegate = self
        collectionView.reloadData()

    }
}

extension FeaturedCell {

    func setCollectionViewDataSourceDelegate <D: FeaturedData> (_ dataSourceDelegate: D, forRow row: Int) {

        collectionView.delegate = dataSourceDelegate
        collectionView.dataSource = dataSourceDelegate

        collectionView.reloadData()
        print("Reload Data")

    }

}

以及包含外部UICollectionViewUIView

class MainView: UIView, UICollectionViewDelegate {

    @IBOutlet var collectionView: UICollectionView!
    let data = MainData()

    override func awakeFromNib() {
        setUp()
    }


    func setUp() {
        collectionView.dataSource = data
        collectionView.delegate = self
        collectionView.backgroundColor = UIColor.orange
        collectionView.collectionViewLayout = createLayout()
        collectionView.isPagingEnabled = true
        collectionView.bounces = false
        collectionView.allowsSelection = true
    }

    func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
        print("WillDisplay")
        guard let cell: FeaturedCell = collectionView.dequeueReusableCell(withReuseIdentifier: "FeaturedCell", for: indexPath) as? FeaturedCell else {
            fatalError("Unable to dequeue FeaturedCell.")
        }
        cell.setCollectionViewDataSourceDelegate(featuredData, forRow: indexPath.item)
    }
}

這兩種方法都被調用,但從未設置過dataSourcedelegates 我也完全遵循教程(甚至使用UITableView ),但它仍然不會設置dataSourcedelegate 我究竟做錯了什么?

我認為這會有所幫助

class FeaturedCell: UICollectionViewCell {

    @IBOutlet var collectionView: UICollectionView!

    override init(frame: CGRect) {
        super.init(frame: frame)
    }

    required init?(coder: NSCoder) {
        super.init(coder: coder)
    }

}

extension FeaturedCell {

    func setCollectionViewDataSourceDelegate <T: UICollectionViewDelegate , D: FeaturedData> (delegate: T  dataSource: D, forRow row: Int) {

        collectionView.delegate = delegate
        collectionView.dataSource = dataSource

        collectionView.reloadData()
        print("Reload Data")
    }
}

並在主視圖中

func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
    print("WillDisplay")
    guard let cell: FeaturedCell = collectionView.dequeueReusableCell(withReuseIdentifier: "FeaturedCell", for: indexPath) as? FeaturedCell else {
        fatalError("Unable to dequeue FeaturedCell.")
    }
    cell.setCollectionViewDataSourceDelegate(self, featuredData, forRow: indexPath.item)
}

對於本教程,您遵循本教程的Github 鏈接,將您的代碼與該鏈接進行比較,看看您遺漏了哪些地方。

希望這會有所幫助。

解決了。 問題在於:

    func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
    print("WillDisplay")
    guard let cell: FeaturedCell = collectionView.dequeueReusableCell(withReuseIdentifier: "FeaturedCell", for: indexPath) as? FeaturedCell else {
        fatalError("Unable to dequeue FeaturedCell.")
    }
    cell.setCollectionViewDataSourceDelegate(featuredData, forRow: indexPath.item)
}

需要改成這樣:

func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
print("WillDisplay")
guard let featuredCell = cell as? FeaturedCell else { return }
featuredCell.setCollectionViewDataSourceDelegate(featuredData, forRow: indexPath.item)

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM