【问题标题】:Swift crash when unwrapping UILabel in UITableView with custom cell使用自定义单元格在 UITableView 中展开 UILabel 时 Swift 崩溃
【发布时间】:2019-04-15 15:29:18
【问题描述】:

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

我的第一个标签栏 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 中的 func 基本上看起来与第一个相同,所以我不明白为什么它会崩溃,它应该有数据。

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")
}

【问题讨论】:

  • 你强制解开这个:for parameters in timeSeries!.parameters。当有一个预期的timeseries 但不存在时,那里可能有一个 nil 值会爆炸。您应该使用 if letguard let 来解开 timeseries
  • 检查 WeatherTemperatureLabel 是否在情节提要中链接

标签: ios swift uitableview uilabel optional


【解决方案1】:

我想你忘了在FavoritedDetailedTableViewController 中更改原型单元格的标识符。在此 TableViewController 中将其更改为

它应该可以工作。

其次你可能忘了在这里设置你的单元格类

同时从 viewDidLoad 中删除这一行

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

【讨论】:

  • 你的意思是 self.tableView.register(WeatherTableViewCell.self, forCellReuseIdentifier: "DetailedWeatherCell")
  • 如果在 IB 中将单元设计为原型单元,您不得注册这些单元。
  • @Robert Dresler 我照你说的做了,但我现在又崩溃了:“由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'无法使具有标识符 WeatherDataCell 的单元格出列-必须注册一个笔尖或标识符的类或连接故事板中的原型单元'"
  • @xxFlashxx 好的,让代码保持原样,然后尝试在情节提要中更改重用标识符并删除您在编辑后的答案中描述的注册单元格的这一行
  • @RobertDresler 更改并删除了该行。同样的崩溃,无法使单元格出列...
【解决方案2】:
  • 2 视图控制器不能重用由两个视图控制器之一创建的相同原型单元
  • WeatherTableViewCell 在 mvc1、mvc2 中不能有 2 个布局
    => 您必须在 xib 文件中创建您的客户单元格并注册一个单元格以供 UITableViewCell 重用。

【讨论】:

    猜你喜欢
    • 2018-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-10
    相关资源
    最近更新 更多