无法将类型为“UICollectionViewCell”的值转换

57

我在Storyboard中使用了自定义的CollectionViewCell。

启动应用程序后,我收到以下错误信息:

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

6个回答

211
在Xcode中,CollectionViewController的模板在viewDidLoad函数中有一行代码,它会改变你Storyboard中的规格。
// Register cell classes
self.collectionView!.register(UICollectionViewCell.self, forCellWithReuseIdentifier: reuseIdentifier)

只需删除那一行。

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

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

1
这个问题导致了错误,删除后视图现在可以加载。但是,现在UICollectionView看起来很糟糕。我认为删除那行代码意味着我在Storyboard中设置的所有布局约束现在都是无用的,必须以编程方式添加? - Dave G
我认为约束问题有另一个原因。根据苹果文档:“在调用集合视图的dequeueReusableCellWithReuseIdentifier:forIndexPath:方法之前,您必须使用此方法或registerNib:forCellWithReuseIdentifier:方法告诉集合视图如何创建给定类型的新单元格。”我的经验是,如果单元格在故事板中定义,则registerNib似乎会自动工作。 - coco
9
一般说明:使用Storyboard原型时,不需要注册单元格类。如果您注册了,则会取代您的原型。 - Wizkid
@nyxee谢谢你的提醒,代码在此期间已经更改。我已经更新了答案。 - coco
经过两个小时的尝试,我进行了谷歌搜索并找到了这个非常好的答案。非常感谢。 - touhid udoy

48

我面临这个问题是因为在 viewDidLoad() 中,我注册了使用 UICollectionViewCell 类的单元格。然而在我的 cellForItemAtIndexPath 中,我使用了 CustomSubcalssCollectionViewCell 来进行单元格重用。

确保 registerClassdequeueReusableCell 使用的是同一个类即可解决该问题。

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

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

11

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

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

Custom Class Section

Document Outline


5

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

storyboard.instantiateViewControllerWithIdentifier("someVC") as! MyViewController

问题在于我在Storyboard中为该VC分配了特定的模块,我已将其移除,这样它就会默认使用当前模块,即应用程序模块(在运行时)和测试模块(在测试时)。

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

您不必删除此行。如果要使用代码注册类,则需要继承UICollectionViewCell.self并注册自己的单元格类。


2

如果你在Storyboard和代码中都注册了你的cell类,你将会收到这个错误。选择其中一个即可,不要同时使用两者,问题就会消失。

我希望苹果不要在他们的模板中包含这一段代码:

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

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

这真的救了我,我尝试了很多不同的方法,只有你有正确的答案。 - lukas28277

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接