Swift - 无法将类视图出列:UICollectionElementKindCell

时间:2017-05-02 09:37:42

标签: ios swift cocoapods jtapplecalendar

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

由于未捕获的异常终止应用程序' NSInternalInconsistencyException',原因:'无法使类型的视图出列:具有标识符CustomCell的UICollectionElementKindCell - 必须为标识符注册一个nib或类或连接一个故事板中的原型单元'

我的代码是:

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
    }
}

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

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

Storyboard

7 个答案:

答案 0 :(得分:6)

这是因为您尚未将xib注册到UICollectionView。如果您使用的是来自Xib的UICollectionViewCell,则必须先注册。

In viewDidLoad: 

写下来:

collectionView.register(UINib(nibName: "name", bundle: nil), forCellWithReuseIdentifier: "cellIdentifier")

答案 1 :(得分:6)

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

如果您只有类自定义类,则按以下方式注册(无xib文件)

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

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

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

答案 2 :(得分:4)

从您粘贴的代码段中,我不会看到您在要出列/使用它之前注册该单元格。需要在使用前注册单元格作为描述的错误。

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

如需快速参考,请参阅以下帖子 - https://www.hackingwithswift.com/example-code/uikit/how-to-register-a-cell-for-uitableviewcell-reuse

截图发布后编辑(请接受此答案,如果适用于您^ _ ^)

从屏幕截图中,您使用的是自定义单元格类' CustomCell',在设置了正确的标识符后,请确保在右侧面板的标识检查器中将正确的类名设置为CustomCell。请参阅下面的屏幕截图 enter image description here

答案 3 :(得分:2)

  1. 如果您在故事板中使用的单元格不是 XIB ,那么您需要将reuseIDentifier设置为enter image description here

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

    中添加此行

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

在我的情况下 我创建一个集合视图与自定义单元格类 CollectionView + Custom Collection Cell + Custom Collection Cell Class Reused Identifier Custom Collection View Class

这是我的自定义CollectionView类代码

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将所有视图从故事板连接到Custom Class,并创建@IBOutlet。
我这样称呼我的自定义类

  

self.AuctionList =带有NSDictionary内容的NSArray

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)
  }      
}

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

答案 6 :(得分:0)

我和我有完全一样的问题。环顾四周后,我意识到我本来应该以大写字母“ P”开头的小写字母“ p”,并且我将其用作标识符。

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