【问题标题】:Could not cast value of type 'UICollectionViewCell'无法转换“UICollectionViewCell”类型的值
【发布时间】:2015-11-16 22:27:44
【问题描述】:

我在 Storyboard 中使用了自定义 CollectionViewCell。 当我启动应用程序时,我收到以下消息:

无法将“UICollectionViewCell”类型的值转换为 TestProject.CollectionViewCell。

【问题讨论】:

    标签: xcode swift uicollectionview uicollectionviewcell


    【解决方案1】:

    Xcode 中 CollectionViewController 的模板随 viewDidLoad 中的这行代码一起提供,它会更改情节提要中的规范。

    // Register cell classes
    self.collectionView!.register(UICollectionViewCell.self, forCellWithReuseIdentifier: reuseIdentifier)
    

    只需删除该行。

    在较旧的 Swift 版本中,该行是:

    // Register cell classes
    self.collectionView!.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: reuseIdentifier)
    

    【讨论】:

    • 这对我造成了错误,删除后,视图现在确实加载了。但是,现在 UICollectionView 看起来很糟糕。我相信删除那行代码意味着我在 Storyboard 中设置的所有布局约束现在都是垃圾并且必须以编程方式添加?
    • 我认为约束问题还有另一个原因。来自 Apple 文档:“在调用集合视图的 dequeueReusableCellWithReuseIdentifier:forIndexPath: 方法之前,您必须使用此方法或 registerNib:forCellWithReuseIdentifier: 方法来告诉集合视图如何创建给定类型的新单元格。”我的经验是,如果在情节提要中定义单元格,则 registerNib 似乎会自动工作。
    • 一般注意事项:使用 Storyboard 原型时无需注册单元类。如果您注册,它将取代您的原型。
    • @nyxee 感谢您的注意,同时代码已更改。我更新了答案。
    • 经过 2 小时的尝试,我进行了谷歌搜索,并找到了这个很好的答案。非常感谢。
    【解决方案2】:

    我遇到了这个问题,因为在viewDidLoad() 我用 UICollectionViewCell 类注册了我的单元格。在我的cellForItemAtIndexPath 中,将 CustomSubcalssCollectionViewCell 用于 dequeueReusableCell。

    确保 registerClassdequeueReusableCell 是同一个类解决问题

    self.registerClass(SomeUICollectionCellClass.self, forCellWithReuseIdentifier: reuseIdentifier)
    
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! SomeUICollectionCellClass
    

    【讨论】:

      【解决方案3】:

      当自定义类(在 Xcode 检查器上)仍将其类设置为默认 UICollectionViewCell 而不是我的 TestProject.CollectionViewCell 自定义类时,我收到此错误。

      要修复它,只需将自定义类更改为您的实现即可。

      【讨论】:

        【解决方案4】:

        我在单元测试中从 Storyboard 实例化 ViewController 时遇到了这个错误。

        storyboard.instantiateViewControllerWithIdentifier("someVC") as! MyViewController
        

        问题是我已将身份检查器中的特定模块分配给情节提要中的该 VC。我删除了它,所以它默认为当前模块,即运行时的应用程序模块和测试时的测试模块。

        【讨论】:

          【解决方案5】:
           self.collectionView!
               .register(MyCollectionViewCell.self, 
                         forCellWithReuseIdentifier: reuseIdentifier
                        )
          

          您不必删除此行。如果您想使用代码注册类,您将注册自己的由UICollectionViewCell.self 继承的单元类

          【讨论】:

            【解决方案6】:

            如果您在 Storyboard 和代码中都注册了您的单元格类,您将收到此错误。选择一个或另一个,永远不要同时选择,问题就会消失。

            我希望 Apple 没有在他们的模板中包含这段代码:

            self.registerClass(SomeUICollectionCellClass.self, forCellWithReuseIdentifier: reuseIdentifier)
            

            特别是因为他们总是建议您通过 Storyboard 注册您的单元格。让事情变得非常混乱。

            【讨论】:

            • 这真的救了我,我尝试了很多不同的方法,只有你有正确的答案
            猜你喜欢
            • 1970-01-01
            • 2018-11-02
            • 2016-03-05
            • 2023-03-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多