我在尝试加载项目时收到此错误消息
由于未捕获的异常终止应用程序' 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
}
}
请帮我调试这个问题。谢谢。
编辑:我已添加了单元格的标识符,但仍然存在错误。
答案 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。请参阅下面的屏幕截图
答案 3 :(得分:2)
答案 4 :(得分:0)
这个问题有很多种可能性。如果您有collection view
的自定义类,则应在identity inspector
中设置。它必须是UICollectionViewCell
的子类。并且您必须在cellforitem
委托方法中使用必须在reusable identifier
中设置的attribute inspector
实例化该子类。在屏幕截图中,Apple calender view
似乎是您的集合视图。如果它是第三方库,那么请确保它允许您取消自定义单元格!并确保它是UICollectionView
的子类。
答案 5 :(得分:0)
在我的情况下
我创建一个集合视图与自定义单元格类
这是我的自定义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单元,打开右侧面板。检查属性检查器和集合可重用视图的标识符名称,还检查身份检查器的自定义类名称。