在表格视图的自定义单元格上隐式展开可选值

Posted

技术标签:

【中文标题】在表格视图的自定义单元格上隐式展开可选值【英文标题】:implicitly unwrapping an Optional value on custom cell of table view 【发布时间】:2019-04-26 07:51:07 【问题描述】:

首先我直截了当地说,我知道这是“重复”,这是我第二次问同样的问题 - 问题是我的第一个问题在我不理解问题的情况下已经关闭,所以请如果有人想再次关闭这个问题首先让我了解我做错了什么。我上次得到的解决方案不相关,所以如果我能得到具体解决,那就太好了!

我正在尝试从一个数组在 tableview 上创建一个自定义单元格。当我在我的自定义单元格上附加任何文件时,我在所有文件上都得到了意想不到的 nil,我不知道为什么

这是我的自定义单元格:

class CustomMovieCell: UITableViewCell 


    @IBOutlet weak var title: UILabel!
    @IBOutlet weak var rating: UILabel!
    @IBOutlet weak var releaseYear: UILabel!
    @IBOutlet weak var genre: UILabel!
    var imageBackground: String!

    override func awakeFromNib() 
        super.awakeFromNib()
        // Initialization code
    

这是我的 UITableView cellForRowAtIndexPath 方法:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "MovieCell", for: indexPath) as! CustomMovieCell
        let movieFetched = Movie(title: moviesArray[indexPath.row].title, image: moviesArray[indexPath.row].image, rating: moviesArray[indexPath.row].rating, releaseYear: moviesArray[indexPath.row].releaseYear, genre: moviesArray[indexPath.row].genre)
        print(movieFetched)
        cell.title.text? = movieFetched.title
        cell.rating.text? = String(movieFetched.rating)
        cell.releaseYear.text? = String(movieFetched.releaseYear)
        cell.genre.text? = String(movieFetched.genre[0])
        return cell

    

我错过了什么?当附加任何文件时,我在展开可选值时意外发现 nil - 我不知道 UIlabel 因为 IBOutlet 是可选的?即使它们在我的自定义单元类中不是可选的。

在调试时,我可以看到单元格的所有值 - 标题、图像、评级、releaseYear 和流派在尝试为它们分配值时都为零 - 所以我现在真的不知道该怎么做。我已经从头开始删除并重新创建了单元格,它没有任何不同。

正如我已经说过的 - 我知道这是“重复的”。但是请 - 在您帮助我之前不要关闭它,因为我上次没有得到任何答案,我被引导到一个没有帮助我理解我的问题的文字墙页面。其他“重复”页面就像一般的“什么是可选值”之类的问题,对这个特定问题没有帮助。

编辑: 如果它可以帮助任何人帮助我解决这个问题,我已经将这个项目上传到 github

https://github.com/alonsd/MoviesApi

【问题讨论】:

情节提要中有原型单元 CustomMovieCell 吗?您是否正确连接了所有 iboutlets? 如果能把样例项目分享给我们就更好了 @AlonShlider 链接未找到 版主备注 - 请在评论区be nice。 @RajeshKumarR 修复了 mag_zbc 很抱歉之前的粗鲁,我已经连续处理这个问题好几个小时了,这让我发疯了。对于 IBOutlets,据我所知,它们连接正确,我有什么迹象表明它连接不正确? 【参考方案1】:

您已将自定义单元格类与 2 个单元格连接起来。一个在 xib 中,另一个在 UIViewController 中。这个UIViewController's 原型单元没有这些标签。所以它会是 nil 并且会崩溃

从情节提要中的MoviesViewController 中删除原型单元格。并将其添加到MoviesViewController viewDidLoad

tableView.register(UINib(nibName: "TableViewCell", bundle: nil), forCellReuseIdentifier: "MovieCell")

tableView cellForRowAt方法如下

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: "MovieCell") as! TableViewCell
    cell.title.text = moviesArray[indexPath.row].title
    cell.rating.text = String(moviesArray[indexPath.row].rating)
    cell.releaseYear.text = String(moviesArray[indexPath.row].releaseYear)
    cell.genre.text = String(moviesArray[indexPath.row].genre[0])

    return cell


【讨论】:

做到了,但仍然无法正常工作。正如 mag zbc 所说,如果这是真的,它会在 dequeueReusableCell 而不是单元格属性上崩溃。所以我再次陷入文件为零的问题。 @AlonShlider 检查更新的答案 tableView.registerNib @mag_zbc TableViewCell 类分配给视图控制器中的 xib 和原型单元。 xib 有标签并连接到自定义类。 viewcontroller 中的另一个原型单元格没有标签,但它是一个有效的单元格。所以他得到了单元格而不是标签 哈利洛亚!非常感谢!终于解决了这个问题。如果有可能删除我在问题中得到的那个-1,那将是很棒的,因为它绝对不是重复的问题,因为它应该是

以上是关于在表格视图的自定义单元格上隐式展开可选值的主要内容,如果未能解决你的问题,请参考以下文章

在隐式展开可选值时意外发现 nil (UICollectionView)

UITableViewCell 中的 AVPlayer 导致“在隐式展开可选值时意外发现 nil”错误

Swift Xcode 致命错误:在隐式展开可选值时意外发现 nil [重复]

Firebase 数据库 - 致命错误:在展开可选值时意外发现 nil

UIControl子类-意外地找到nil,同时隐式展开一个可选值

removeFromSuperView() 和单元格 = 致命错误:在展开可选值时意外发现 nil