无法转换 'UICollectionViewCell' 类型的值

Could not cast value of type 'UICollectionViewCell'

我在故事板中使用自定义 CollectionViewCell。 当我启动应用程序时,我收到此消息:

Could not cast value of type 'UICollectionViewCell' to TestProject.CollectionViewCell.

Xcode 中的 CollectionViewController 模板在 viewDidLoad 中附带了这行代码,它改变了故事板中的规范。

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

只需删除该行即可。

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

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

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

storyboard.instantiateViewControllerWithIdentifier("someVC") as! MyViewController

问题是我已将身份检查器中的特定模块分配给 Storyboard 中的那个 VC。我删除了它,因此它默认为当前模块,即 运行 时的应用程序模块和测试时的测试模块。

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

确保registerClassdequeueReusableCell相同class解决问题

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

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

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

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

 self.collectionView!
     .register(MyCollectionViewCell.self, 
               forCellWithReuseIdentifier: reuseIdentifier
              )

您不必删除此行。如果您想使用代码

注册 class,您将注册自己的 class 继承自 UICollectionViewCell.self 的单元格

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

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

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

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