UICollectionView 中的 Nib Cell 注册不显示

Posted

技术标签:

【中文标题】UICollectionView 中的 Nib Cell 注册不显示【英文标题】:Nib Cell registration in UICollectionView does not show 【发布时间】:2020-03-03 05:52:08 【问题描述】:

我正在尝试在我的 collectionView 中注册一个 nib 单元格,但它不会显示。

这是我的MenuCardVC

import UIKit

class MenuCardVC: UIViewController


    @IBOutlet weak var collectionView: UICollectionView!

    var drinksMenu = [Drink]()

    var venueId: String?

    //Selected venue
    var venue: Venue? 
        didSet
            loadDrinksMenu()
        
    


    override func viewDidLoad() 
        super.viewDidLoad()


        self.collectionView.delegate = self
        self.collectionView.dataSource = self

        let nib = UINib(nibName: "DrinkMenuCell", bundle: nil)
        self.collectionView.register(nib, forCellWithReuseIdentifier: "DrinkMenuCell")



    //end viewDidLoad


    func loadDrinksMenu()

        Utilities.run.showSVHUDWithStatus(uiView: self.view, status: "Loading menu")
        getJWTfromGoogleCloudFunction()


    //end func

    func getJWTfromGoogleCloudFunction()

        DoshiiServices.shared.getJWTfromGoogleCloudFunction  (token) in

            self.drinksMenu.removeAll()

            DoshiiServices.shared.getMenu(token: token, locationId: "xxxxxxx")  (bool, drinksMenu) in


                self.drinksMenu = drinksMenu
                Utilities.run.dismissSVHUD(delay: 0.2)

            //end getMenu

        //getJWTfromGoogleCloudFunction

    //end func

//end class

extension MenuCardVC: UICollectionViewDelegate, UICollectionViewDataSource 

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 

        return drinksMenu.count

    //end func

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 

        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "DrinkMenuCell", for: indexPath) as! DrinkMenuCell

        cell.configureCell(item: "BEER") //<---testing

        return cell

    //end func

//end extension

这是我的DrinkMenuCell

class DrinkMenuCell: UICollectionViewCell 

    @IBOutlet weak var label: UILabel!

    override func awakeFromNib() 
        super.awakeFromNib()

    

    func configureCell(item: String)

        self.label.text = item


    //end func


我已经正确设置了我的单元格标识符

【问题讨论】:

您应该在设置drinksMenu(在getMenu 块中)之后调用collectionView.reloadData() 当然,数组初始化时什么都没有,所以在重新加载之前什么都不会显示。就是这样! :) - 认为这可能很简单。谢谢! 【参考方案1】:

您应该在设置drinksMenu(在getMenu 块中)之后调用collectionView.reloadData()

func getJWTfromGoogleCloudFunction()

    DoshiiServices.shared.getJWTfromGoogleCloudFunction  (token) in

        self.drinksMenu.removeAll()

        DoshiiServices.shared.getMenu(token: token, locationId: "xxxxxxx")  (bool, drinksMenu) in


            self.drinksMenu = drinksMenu
            Utilities.run.dismissSVHUD(delay: 0.2)
            // Add here!
            self.collectionView.reloadData()

        //end getMenu

    //getJWTfromGoogleCloudFunction

//end func

【讨论】:

【参考方案2】:

从服务器获取数据后调用collectionView.reloadData()。 在本节中您需要添加

DoshiiServices.shared.getMenu(token: token, locationId: "xxxxxxx")  (bool, drinksMenu) in
   self.drinksMenu = drinksMenu
   Utilities.run.dismissSVHUD(delay: 0.2)
   self.collectionView.reloadData()

【讨论】:

【参考方案3】:

drinksMenudidSet 观察者中对collectionView 调用reloadData(),即

var drinksMenu = [Drink]() 
    didSet 
        self.collectionView.reloadData()
    

【讨论】:

以上是关于UICollectionView 中的 Nib Cell 注册不显示的主要内容,如果未能解决你的问题,请参考以下文章

UIView Nib 内的 UICollectionView

IOS UICollectionView 为 UICollectionViewCell 注册 nib 不起作用

UICollectionView,来自注册为单元格的框架目标的 nib 在运行时失败

iOS UICollectionView 动态切换单元格NIB

在 iOS 12 中,UICollectionView 何时布局单元格,在 nib 中使用 autolayout

UICollectionView 出错