Swift Cocoa Touch 自定义单元格为 IBOutlets 返回 nil
Posted
技术标签:
【中文标题】Swift Cocoa Touch 自定义单元格为 IBOutlets 返回 nil【英文标题】:Swift Cocoa Touch custom cell returning nil for IBOutlets 【发布时间】:2014-07-24 14:42:42 【问题描述】:我正在编写一个应用程序,其中我在表格视图单元格中有一个水平集合视图。
当尝试以编程方式设置单元格中的文本时,应用程序崩溃并显示 fatal error: unexpectedly found nil while unwrapping an Optional value
错误消息。
对我和经验丰富的 cocoa-touch 程序员来说,这表明我的 IBOutlets 连接不正确,因此cell.filmTitle
在显式解包时将返回 nil。因此,在重新编码 IBOutlets 并重新连接它们之前,我将所有 IBOutlets 与单元格 XIB 断开连接,并删除了它们背后的所有代码。但是错误仍然存在。
自定义单元格的代码是:
class homeWhatsOnCellectionCell: UICollectionViewCell
@IBOutlet var filmTitle: UILabel!
@IBOutlet var filmPoster: UIImageView!
集合视图数据源的代码是:
func collectionView(collectionView: UICollectionView!, numberOfItemsInSection section: Int) -> Int
return 1
func collectionView(collectionView: UICollectionView!, cellForItemAtIndexPath indexPath: NSIndexPath!) -> UICollectionViewCell!
var cell: homeWhatsOnCellectionCell = collectionView.dequeueReusableCellWithReuseIdentifier("Home Whats On Collection View Cell", forIndexPath: indexPath) as homeWhatsOnCellectionCell
cell.filmTitle.text = "The Hunger Games: Catching Fire"
cell.filmPoster.image = UIImage(named: "The Hunger Games.jpg")
return cell
func numberOfSectionsInCollectionView(collectionView: UICollectionView!) -> Int
return 1
编辑:从与 Nate Cook 的对话中,我可以说 filmTitle
是问题的原因,尽管已正确连接到标签,但它是 nil
。此外,dump(cell)
向控制台输出了“-”。感谢任何可以提供帮助的人。
编辑2:通过进一步调查,我发现根本看不到细胞。当我删除 IBOutlets,并试图简单地显示 10 个单元格时,它们出现在 XIB 中,它们根本不显示,我得到的只是 10 个相同大小的空白单元格。它显示了一些单元格,因为滚动条会根据显示的单元格的数量改变大小和滚动。
【问题讨论】:
cell
出列后的值是多少? "Home Whats On Collection View Cell"
真的是重用标识符吗?
@Nate 如何找到cell
的值?运行println(cell)
,如果这就是你的意思,打印:_TtC21Films225homeWhatsOnCellectionCell: 0x797d6700; baseClass = UICollectionViewCell; frame = (0 10; 104 160); layer = <CALayer: 0x797d6910>>
不用担心。你也可以为cell.filmTitle
做同样的事情吗?
IBOutlet
不能正确连接,或者 IB 中存在给您带来麻烦的错误。只是为了验证一下,您只有一个类型为 homeWhatsOnCellectionCell
的原型单元格,它具有重用标识符“Home Whats On Collection View Cell”,并且插座连接到该单元格中的字段?
我遇到的与this question 相关的问题。我不得不删除 contactsView.registerClass(ContactCell.self, forCellWithReuseIdentifier: "ContactCell")
【参考方案1】:
听起来 XIB 文件甚至没有加载。
要么在 IB 中正确设置,要么在 viewDidLoad 的视图控制器中手动设置
// register table view cell in external XIB file "YourFileName.xib"
tableView.registerNib(UINib(nibName: "YourFileName", bundle: nil), forCellReuseIdentifier: "Home Whats On Collection View Cell")
如果您使用带有原型单元的情节提要,请确保在 Interface Builder 中设置单元重用标识符。
我猜问题的核心是表视图不知道使用这个重用标识符加载哪个类。不过,如果有一个堆栈跟踪和更多关于此的信息,那就太好了。您是否使用带有表格视图单元格的 XIB 文件?您是否在情节提要中使用原型?
【讨论】:
以上是关于Swift Cocoa Touch 自定义单元格为 IBOutlets 返回 nil的主要内容,如果未能解决你的问题,请参考以下文章
Xcode6 中的 Swift 类与 Cocoa Touch 类
如何将用 Swift 编写的 Cocoa Touch 框架导入 .pch 文件?