使用 Swift 的 UICollectionView 错误

Posted

技术标签:

【中文标题】使用 Swift 的 UICollectionView 错误【英文标题】:UICollectionView error using Swift 【发布时间】:2014-06-12 07:58:17 【问题描述】:

我收到此错误,尝试在 Swift 中使用 UICollectionView:

NSInternalInconsistencyException', reason: 'attempt to register a cell class which is not a subclass of UICollectionViewCell ((null))

但我想我正在注册单元格:

    ViewDidLoad:

    override func viewDidLoad()
    
        super.viewDidLoad()
        self.collectionView.registerClass(NSClassFromString("CollectionCell"),forCellWithReuseIdentifier:"CELL")
    
    

    cellForItemAtIndexPath:

    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath:NSIndexPath)->UICollectionViewCell
    
       var  cell = collectionView.dequeueReusableCellWithReuseIdentifier("CELL", forIndexPath: indexPath) as CollectionCell
    
        cell.titleLabel.text="cellText"
        return cell
    
    

和细胞类:

    class CollectionCell: UICollectionViewCell
    

        @IBOutlet var titleLabel : UILabel
        init(coder aDecoder: NSCoder!)
        
            super.init(coder: aDecoder)

         
     

任何帮助表示赞赏

【问题讨论】:

【参考方案1】:

您需要以 Swift 风格将 UICollectionViewCell 的子类传递给 registerClass:

self.collectionView.registerClass(CollectionCell.self, forCellWithReuseIdentifier:"CELL")

【讨论】:

谢谢!进展,现在我得到一个“使用未实现的初始化程序'init(frame :)”,但我到了那里! 这解决了.. init(frame: CGRect) super.init(frame: frame) 再次感谢。【参考方案2】:

如果您没有使用任何自定义类,只需在 ViewDidLoad 中使用

myCollectionView!.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: "Cell")

【讨论】:

【参考方案3】:
myCollectionView!.registerClass(UICollectionViewCell.classForCoder(), forCellWithReuseIdentifier: "cellID")

是推荐的代码。为我工作。希望对您有所帮助。

【讨论】:

【参考方案4】:

对于您的细胞:

class CollectionCell: UICollectionViewCell

@IBOutlet var titleLabel : UILabel
init(coder aDecoder: NSCoder!)

    super.init(coder: aDecoder)


对于您的 ViewController:

import UIKit
class NextViewController: UIViewController

@IBOutlet var collectionView : UICollectionView
var ListArray=NSMutableArray()
 override func viewDidLoad()

super.viewDidLoad()

 var nipName=UINib(nibName: "GalleryCell", bundle:nil)
collectionView.registerNib(nipName, forCellWithReuseIdentifier: "CELL")

for i in 0..70

     ListArray .addObject("C: \(i)")





func collectionView(collectionView: UICollectionView, numberOfItemsInSection section:Int)->Int

    return ListArray.count


func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath      indexPath:NSIndexPath)->UICollectionViewCell

    var  cell = collectionView.dequeueReusableCellWithReuseIdentifier("CELL", forIndexPath: indexPath) as GalleryCell
   cell.titleLabel.text="\(ListArray.objectAtIndex(indexPath.item))"
   return cell


func collectionView(collectionView : UICollectionView,layout  collectionViewLayout:UICollectionViewLayout,sizeForItemAtIndexPath indexPath:NSIndexPath) -> CGSize

return CGSizeMake(66, 58)


override func didReceiveMemoryWarning() 
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.


【讨论】:

谢谢,但我更喜欢使用 registerClass 而不是 registerNib。 但是下次我会保留这个.. +1【参考方案5】:

试试这个: self.collectionView.registerClass(CollectionViewCell.self,forCellWithReuseIdentifier:"CELL")

【讨论】:

感谢您的回答。按照您的建议进行更改会导致以下控制台输出: 0x1001bffeb: leaq 0x16067(%rip), %rax ; “Swift 动态转换失败” 0x1001bfff2: movq %rax, 0x77c67(%rip) ; gCRAnnotations + 8 0x1001bfff9: int3 0x1001bfffa: nopw (%rax,%rax)

以上是关于使用 Swift 的 UICollectionView 错误的主要内容,如果未能解决你的问题,请参考以下文章

ios 8.1:类型“ViewController”不符合协议“UICollectionViewDataSource”

使用 UICollectionViewFlowLayout 时在 UICollectionViewCell 的边界之外绘制

无法从 UIViewController 导航到 UICollectionViewController

UITableViewCell 中的 UICollectionView?

UICollectionView 导致单元格的自动布局问题

在单个 UICollectionViewController 中管理多个 UICollectionViewLayout