Swift - 无法使同类视图出队:UICollectionElementKindCell

Swift - could not dequeue a view of kind: UICollectionElementKindCell

我在尝试加载我的项目时收到此错误消息

由于未捕获的异常 'NSInternalInconsistencyException',正在终止应用程序,原因:'could not dequeue a view of kind: UICollectionElementKindCell with identifier CustomCell - must register a nib or a class for the identifier or connect a prototype cell in a storyboard'

我的代码是:

extension ViewController: JTAppleCalendarViewDelegate, JTAppleCalendarViewDataSource {
    func configureCalendar(_ calendar: JTAppleCalendarView) -> ConfigurationParameters {
        formatter.dateFormat = "yyyy MM dd"
        formatter.timeZone = Calendar.current.timeZone
        formatter.locale = Calendar.current.locale

        let startDate = formatter.date(from: "2017 01 01")!
        let endDate = formatter.date(from: "2017 12 31")!

        let parameters = ConfigurationParameters(startDate: startDate, endDate: endDate)
        return parameters
    }

    func calendar(_ calendar: JTAppleCalendarView, cellForItemAt date: Date, cellState: CellState, indexPath: IndexPath) -> JTAppleCell {
        let cell = calendar.dequeueReusableJTAppleCell(withReuseIdentifier: "CustomCell", for: indexPath) as! CustomCell
        cell.dateLabel.text = cellState.text
        return cell
    }
}

请帮我调试这个问题。谢谢。

编辑:我已经为单元格添加了标识符,但错误仍然存​​在。

这是因为您还没有将您的 xib 注册到 UICollectionView。如果您使用 Xib 的 UICollectionViewCell,您必须先注册它。

In viewDidLoad: 

写出来:

if let xib = NSNib.init(nibNamed: "TemplateNBgCollectionItem", bundle: nil) {
   self.collectionView.register(xib, forItemWithIdentifier: NSUserInterfaceItemIdentifier(rawValue: "cvItem"))  
}
  1. 如果你在情节提要中使用单元格而不是 XIB 那么你需要设置 reuseIDentifier 如下

  2. 如果您使用单独的 XIB 作为单元格,那么您需要在 ViewDidLoad

    中添加这一行

    collectionView.register(UINib(nibName: "NibName", bundle: nil), forCellWithReuseIdentifier: "reuseIdentifier")

viewDidLoad方法中: 您必须使用 collectionView 对象注册自定义单元格 class/xib 名称。

如果你只有class自定义class那么你可以通过以下方式注册(没有xib文件)

collectionView.register(CustomCell.self, forCellWithReuseIdentifier: "cellId")

如果你同时拥有class和xib文件那么你可以通过这种方式注册

collectionView.register(UINib(nibName: "CustomCell", bundle: nil), forCellWithReuseIdentifier: "cellId")

从您粘贴的代码片段来看,我没有看到您在想要 dequeue/use 之前注册单元格。如描述的错误,使用前需要注册cell。

tableView.register(UITableViewCell.self, forCellReuseIdentifier: "DefaultCell")

为了您的快速参考,请参阅下文 post - https://www.hackingwithswift.com/example-code/uikit/how-to-register-a-cell-for-uitableviewcell-reuse


截图后编辑posted(如果适合你,请接受这个答案^_^)

从屏幕截图来看,您正在使用自定义单元格 class 'CustomCell',在您设置正确的标识符后,请确保在身份中设置正确的 class 名称作为 CustomCell右面板的检查器。请参阅下面的屏幕截图。

这个问题有多种可能性。如果您为 collection view 自定义了 class,那么它应该设置在 identity inspector 中。并且必须是 UICollectionViewCell 的子class。并且您必须在 cellforitem 委托方法中使用必须在 attribute inspector 中设置的正确 reusable identifier 实例化该子 class。在您的屏幕截图中,Apple calender view 似乎是您的 collection 视图。如果它是第三方库,那么请确保它允许您对自定义单元格进行双端队列!并确保它是 UICollectionView 的子 class。

以我为例 我正在使用 class
创建带有自定义单元格的集合视图

这是我的自定义 CollectionView Class 代码

import UIKit
class Auction_CollectionCell: UICollectionViewCell {

@IBOutlet weak var Productimage: UIImageView!
@IBOutlet weak var name: UILabel!
@IBOutlet weak var bid: UILabel!
@IBOutlet weak var progress: UIProgressView!
@IBOutlet weak var day: UILabel!
@IBOutlet weak var hours: UILabel!
@IBOutlet weak var mins: UILabel!
@IBOutlet weak var secs: UILabel!
@IBOutlet weak var lblday: UILabel!
@IBOutlet weak var lblhours: UILabel!
@IBOutlet weak var lblmin: UILabel!
@IBOutlet weak var lblsecs: UILabel!
@IBOutlet weak var MainView: UIView!

   override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code
    }
}

通过 CTRL+Drag 将故事板中的所有视图连接到自定义 Class,然后将创建 @IBOutlet。
我这样称呼我的习惯 class

self.AuctionList = NSArray with NSDictionary Content

func collectionView(_ collectionView: UICollectionView,
                    numberOfItemsInSection section: Int) -> Int {
    return self.AuctionList.count
}
func collectionView(_ collectionView: UICollectionView,cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

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

    cell.lblday.text = "Day"
    cell.lblhours.text = "Hours"
    cell.lblmin.text = "Minutes"
    cell.lblsecs.text = "Secs"

    cell.MainView.layer.cornerRadius = 5
    cell.MainView.backgroundColor = UIColor.white
    cell.MainView.layer.borderWidth = 0.5
    cell.MainView.layer.borderColor = UIColor.gray.cgColor


    return cell
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
 var width = CGFloat(0)
 var height = CGFloat(0)
 if (UIDevice.current.userInterfaceIdiom == .pad){
   width = CGFloat((self.view.bounds.size.width / 4.0) - 15)
   height = CGFloat(246.0)
 }else{
   width = CGFloat((self.view.bounds.size.width / 2.0) - 15)
   height = CGFloat(246.0)
}

   print("Resize Image \(width) \(height)")
   return CGSize(width: width, height: height)
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
if let dic = AuctionList[indexPath.row] as? NSDictionary{
    Product.product_id = "\((dic["product_id"])!)"
    Product.product_image = "\((dic["image"])!)"
    Product.auction_id = "\((dic["auction_id"])!)"
    performSegue(withIdentifier: "auctionProductDetails", sender: self)
  }      
}

玩得开心,祝你好运。 随意编辑我的答案

我遇到了完全相同的问题。环顾四周后,我意识到我有一个小写字母 "p" 而它应该是一个大写字母 "P" 并且我使用的名称作为标识符。

单击故事板上的 collectionView 单元格,打开右侧面板。检查属性检查器和集合可重用视图,标识符名称,还要检查身份检查器,自定义 class 名称。