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的主要内容,如果未能解决你的问题,请参考以下文章

从 swift cocoa touch 框架导入 jwt

构建纯 Swift Cocoa Touch 框架

Xcode6 中的 Swift 类与 Cocoa Touch 类

如何将用 Swift 编写的 Cocoa Touch 框架导入 .pch 文件?

《从零开始学Swift》学习笔记(Day 68)——Cocoa Touch设计模式及应用之响应者链与触摸事件

带有嵌入库的 Cocoa Touch Framework Swift