使用自定义单元格在UITableView中展开UILabel时,Swift崩溃

时间:2018-11-12 21:09:56

标签: ios swift uitableview uilabel optional

我有一个表栏,其中有3个独立的MVC。第一个MVC是UITableView,我可以在其中搜索位置,它会显示10天的天气预报。第二个MVC也UITableView存储我最喜欢的位置。我可以点击该位置,这将带给我另一个UITableView,它与第一个标签栏一样显示10天的天气预报。但是,我得到一个“线程1:致命错误:在展开一个可选值时意外发现nil” 。我正在使用自定义原型单元格,就像第一个标签栏视图一样,它在那里工作得很好。 enter image description here

第一个标签栏mvc的代码如下:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "WeatherDataCell", for: indexPath)

let weatherCell = timeSeries[indexPath.row]
if let wc = cell as? WeatherTableViewCell {
    wc.timeSeries = weatherCell
}

return cell
}

自定义原型单元格类似于:

class WeatherTableViewCell: UITableViewCell {

    @IBOutlet weak var WeatherImageView: UIImageView!
    @IBOutlet weak var WeatherTimeLabel: UILabel!
    @IBOutlet weak var WeatherTemperatureLabel: UILabel!
    @IBOutlet weak var WeatherWindLabel: UILabel!
    @IBOutlet weak var WeatherPrecipitationLabel: UILabel!

    var timeSeries : TimeSeries? {
        didSet {
            updateUI()
        }
    }

    func updateUI() {
        for parameters in timeSeries!.parameters {
        if parameters.name == "t" {
            let temperature = parameters.values[0]
            WeatherTemperatureLabel.text? = "\(temperature) °C" // <- works for the first MVC but crashes on the second MVC even though i can print out the temperature
        }
    }
}

在几秒钟内,MVC的函子基本上与第一个函子相同,所以我不明白为什么它崩溃了,它应该有数据。

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "DetailedWeatherCell", for: indexPath) as! WeatherTableViewCell

let weatherCell = timeSeries[indexPath.row]        
let wc = cell
wc.timeSeries = weatherCell

return cell

}

为清楚起见添加了其他代码(我的FavoriteDetailedTableViewController类):

    override func viewDidLoad() {
        super.viewDidLoad()
        self.tableView.register(WeatherTableViewCell.self, forCellReuseIdentifier: "DetailedWeatherCell")
}

2 个答案:

答案 0 :(得分:1)

我认为您忘记了在FavoritedDetailedTableViewController中更改原型单元的标识符。在此TableViewController中将其更改为

enter image description here

它应该可以工作。

其次,您可能忘记了在此处设置单元格类

enter image description here

还要从viewDidLoad删除此行

self.tableView.register(WeatherTableViewCell.self, forCellReuseIdentifier: "DetailedWeatherCell")

答案 1 :(得分:1)

  • 2个视图控制器无法重用由两个视图控制器之一创建的同一原型单元
  • WeatherTableViewCell在mvc1,mvc2中不能有2个布局
    =>您必须在xib文件中创建客户单元,并注册一个单元以供UITableViewCell重用。