Issues with casting celltypes to dequeue
Hi i'm having issues in my cellForItemAt its saying the error below. I don't see why i'm unable to cast the cells. It occurs at the first line of the else statement.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in may also be helpful.
Could not cast value of type 'Spoexs.MenuCell2' (0x10d059660) to 'Spoexs.MenuCell1' (0x10d0595c0).
import UIKit import MIBadgeButton_Swift class SecondMenuBar: UIView, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout { lazy var collectionView: UICollectionView = { let layout = UICollectionViewFlowLayout() let cv = UICollectionView(frame: .zero, collectionViewLayout: layout) cv.backgroundColor = UIColor.rgb(r:240, g:240, b:240) cv.dataSource = self cv.delegate = self return cv }() let cellId = "cellId" let cellId2 = "cellId2" let menuItems = ["inventory", "checkout", "scanner"] var inventoryController: InventoryTabController? override init(frame: CGRect){ //on run super.init(frame: frame) collectionView.register(MenuCell1.self, forCellWithReuseIdentifier: cellId) //registering superclass collectionView.register(MenuCell2.self, forCellWithReuseIdentifier: cellId) //registering superclass addSubview(collectionView) addConstraintsWithFormat("H:|[v0]|", views: collectionView) addConstraintsWithFormat("V:|[v0]|", views: collectionView) let selectedIndexPath = NSIndexPath(item:0, section:0) collectionView.selectItem(at: selectedIndexPath as IndexPath, animated: false, scrollPosition: []) //home button glows on run //setup horizontal bar slider() NotificationCenter.default.addObserver(forName: .arrayValueChanged, object: nil, queue: OperationQueue.main) { [weak self] (notif) in badge = "(checkout.count)" self?.collectionView.reloadData() } } deinit { NotificationCenter.default.removeObserver(self) } var horizontalBarLeftAnchorConstraint: NSLayoutConstraint? func slider() { let horizontalBarView = UIView() if #available(iOS 10.0, *) { horizontalBarView.backgroundColor = UIColor(displayP3Red:0.29, green:0.78, blue:0.47, alpha:0.2) } else { horizontalBarView.backgroundColor = UIColor.rgb(r:190, g:190, b:190) } horizontalBarView.translatesAutoresizingMaskIntoConstraints = false addSubview(horizontalBarView) //add to hierarchy // need x,y coordinate horizontalBarLeftAnchorConstraint = horizontalBarView.leftAnchor.constraint(equalTo: self.leftAnchor) horizontalBarLeftAnchorConstraint?.isActive = true horizontalBarView.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive = true horizontalBarView.widthAnchor.constraint(equalTo: self.widthAnchor, multiplier: 1/3).isActive = true horizontalBarView.heightAnchor.constraint(equalToConstant: 3).isActive = true } func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { inventoryController?.scrollToMenuIndex(menuIndex: indexPath.item) print("Right here (indexPath.section)") print("Right here (indexPath.item)") } func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { return CGSize(width: frame.width/3, height: frame.height) } func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat { return 0 } func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return 3 } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { if indexPath.section == 1{ let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId2, for: indexPath) as! MenuCell2 cell.imageView2.setImage(UIImage(named:menuItems[indexPath.section])?.withRenderingMode(.alwaysTemplate), for: .normal) cell.imageView2.badgeString = badge cell.tintColor = UIColor.rgb(r:255, g:0, b:255) //set tint color return cell } else{ let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as! MenuCell1 cell.imageView1.image = UIImage(named: menuItems[indexPath.section])?.withRenderingMode(.alwaysTemplate) cell.tintColor = UIColor.rgb(r:255, g:0, b:255) //set tint color return cell } } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } } class MenuCell1: UICollectionViewCell { override init(frame: CGRect){ super.init(frame: frame) setupViews() } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } let imageView1: UIImageView = { let iv = UIImageView() iv.image = UIImage(named: "")?.withRenderingMode(.alwaysTemplate) iv.tintColor = UIColor.rgb(r:144, g:157, b:255)//set tint color of each menu image bg return iv }() override var isSelected: Bool { didSet { imageView1.tintColor = isSelected ? UIColor.rgb(r:76, g:200, b:120) : UIColor.rgb(r:190, g:190, b:190) //green when selected otherwise grey } } func setupViews() { addSubview(imageView1) addConstraintsWithFormat("H:[v0(28)]", views: imageView1) addConstraintsWithFormat("V:[v0(28)]", views: imageView1) addConstraint(NSLayoutConstraint(item: imageView1, attribute: .centerX, relatedBy: .equal, toItem: self, attribute: .centerX, multiplier:1, constant: 0)) //center menu icons addConstraint(NSLayoutConstraint(item: imageView1, attribute: .centerY, relatedBy: .equal, toItem: self, attribute: .centerY, multiplier:1, constant: 0)) } } class MenuCell2: UICollectionViewCell { override init(frame: CGRect){ super.init(frame: frame) setupViews() } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } let imageView2: MIBadgeButton = { let button = MIBadgeButton() var image = UIImage(named: "home")?.withRenderingMode(.alwaysTemplate) button.setImage(image, for: .normal) button.badgeString = badge button.isUserInteractionEnabled = false button.tintColor = UIColor.rgb(r:190, g:190, b:190) //intital button tint grey return button }() override var isSelected: Bool { didSet { imageView2.tintColor = isSelected ? UIColor.rgb(r:76, g:200, b:120) : UIColor.rgb(r:190, g:190, b:190) //green when selected otherwise grey } } func setupViews() { addSubview(imageView2) addConstraintsWithFormat("H:[v0(28)]", views: imageView2) addConstraintsWithFormat("V:[v0(28)]", views: imageView2) addConstraint(NSLayoutConstraint(item: imageView2, attribute: .centerX, relatedBy: .equal, toItem: self, attribute: .centerX, multiplier:1, constant: 0)) //center menu icons addConstraint(NSLayoutConstraint(item: imageView2, attribute: .centerY, relatedBy: .equal, toItem: self, attribute: .centerY, multiplier:1, constant: 0)) } }
Your code for registering the cell classes is wrong:
collectionView.register(MenuCell1.self, forCellWithReuseIdentifier: cellId)
collectionView.register(MenuCell2.self, forCellWithReuseIdentifier: cellId) // <-- probably not intended
You are registering both classes for the same cellId
, one should be cellId2
:
collectionView.register(MenuCell1.self, forCellWithReuseIdentifier: cellId)
collectionView.register(MenuCell2.self, forCellWithReuseIdentifier: cellId2)
The problem is this line:
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as! MenuCell1
The cell you have registered for this reuse identifier is MenuCell2, so that is what you get. You cannot then magically turn it into a MenuCell1!
链接地址: http://www.djcxy.com/p/74278.html上一篇: 分析在Azure上运行的网站性能的步骤
下一篇: 投射细胞类型出列的问题