2

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

由于未捕获的异常“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
    }
}

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

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

故事板

4

7 回答 7

9

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

如果您只有类自定义类,那么您通过以下方式注册(无 xib 文件)

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

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

collectionView.register(UINib(nibName: "CustomCell", bundle: nil), forCellWithReuseIdentifier: "cellId")
于 2017-05-02T09:51:28.237 回答
7

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

In viewDidLoad: 

写下来:

if let xib = NSNib.init(nibNamed: "TemplateNBgCollectionItem", bundle: nil) {
   self.collectionView.register(xib, forItemWithIdentifier: NSUserInterfaceItemIdentifier(rawValue: "cvItem"))  
}
于 2017-05-02T09:43:55.180 回答
4

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

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

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


截图发布后编辑(如果对你有用,请接受这个答案^_^)

从屏幕截图中,您正在使用自定义单元格类“CustomCell”,设置正确的标识符后,请确保在右侧面板的身份检查器中将正确的类名设置为 CustomCell。请参阅下面的屏幕截图。 在此处输入图像描述

于 2017-05-02T09:56:55.963 回答
3
  1. 如果您在情节提要中使用单元格而不是XIB,那么您需要如下设置重用标识符在此处输入图像描述

  2. 如果您对单元格使用单独的XIB,则需要将此行添加到ViewDidLoad

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

于 2017-05-02T09:51:04.153 回答
0

我的问题完全相同。环顾四周后,我意识到我有一个小写的“p”,而它本应是一个大写的“P”,而我用作标识符的名称。

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

于 2019-01-17T17:24:55.500 回答
0

在我的情况 下,我创建一个带有类的自定义单元格的集合视图这是我的自定义 CollectionView 类代码
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 将故事板中的所有视图连接到自定义类,@IBOutlet 将被创建。
我这样称呼我的自定义课程

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

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

于 2017-12-12T05:14:00.620 回答
0

这个问题有很多可能性。如果您有自定义类,collection view则应将其设置为 identity inspector. 它必须是 的子类UICollectionViewCell。你必须在你的cellforitem委托方法中实例化那个子类,reusable identifier并且必须在attribute inspector. 在您的屏幕截图中,这似乎Apple calender view是您的收藏视图。如果它是第三方库,请确保它允许您将自定义单元格从队列中取出!并确保它是UICollectionView.

于 2017-05-02T10:29:11.110 回答