在表格视图的自定义单元格上隐式展开一个Optional值

时间:2019-04-26 07:51:08

标签: ios swift null optional

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

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

这是我的自定义单元格

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

    }

我想念什么?当附加任何文件时,我在打开可选值时意外发现为零-我不知道UIlabel作为IBOutlet是可选的吗?即使它们在我的自定义单元格类中不是可选的。

在调试时,我可以看到该单元的所有值-标题,图像,等级,releaseYear和流派在尝试为其分配值时均为零-因此,我现在真的不知道该怎么做。我已删除并重新创建了该单元,并且没有任何区别。

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

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

https://github.com/alonsd/MoviesApi

1 个答案:

答案 0 :(得分:1)

您已将自定义单元格类与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

}