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

implicitly unwrapping an Optional value on custom cell of table view

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

我正在尝试通过数组在表视图上创建自定义单元格。当我在我的自定义单元格上附加任何文件时,我在所有文件上都得到了意外的 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 是可选的? even-though 它们在我的自定义单元格中不是可选的 class。

在调试时,我可以看到单元格的所有值 - 标题、图像、评级、发布年份和流派在尝试为它们赋值时都是 nil - 所以我真的不知道此时该做什么。我已经从头开始删除 re-created 单元格,但没有任何不同。

正如我已经说过的 - 我知道这是 "duplicate"。不过请不要在帮助我之前关闭它,因为上次我没有得到任何答复,我被定向到一个 wall-of-text 页面,该页面无法帮助我理解我的问题。其他 "duplicate" 页面就像是一般性的 "what are optional values" 类问题,不能帮助我解决这个具体问题。

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

https://github.com/alonsd/MoviesApi

您已将自定义单元格 class 连接到 2 个单元格。一个在xib,另一个在这个UIViewController。此 UIViewController's 原型单元格没有这些标签。所以它将为零并且它会崩溃

从情节提要中的 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

}