【问题标题】:How can I catch a nil error when trying to select a row in a UIPickerView?尝试在 UIPickerView 中选择一行时如何捕获 nil 错误?
【发布时间】:2018-02-01 16:48:06
【问题描述】:

显然,如果您在第一次运行视图时尝试从 viewWillAppear 中的 UIPickerView 中获取元素,则应用程序将崩溃并返回 nil 错误。

如果我注释掉以下行并运行应用程序,一切正常。然后我取消注释以下行并再次运行,它工作正常并继续正常工作。

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    myPicker.selectRow(0, inComponent: 0, animated: true)
}

我不知道有什么区别。也许应用程序中发生了其他事情。有没有办法抓住最初的nil 并吞下它?它将模仿视图的第一次访问并注释掉代码。首次访问视图后,nil 不会返回。

【问题讨论】:

标签: swift uipickerview swift4 uivewcontroller


【解决方案1】:

如果选择器被声明为隐式解包可选,默认情况下只是可选链:

myPicker?.selectRow(0, inComponent: 0, animated: true)

【讨论】:

  • 不。仍然得到:致命错误:在展开可选值时意外发现 nil。
  • 真的吗?这段代码和假设是不太可能的。
  • 我找到了问题所在。应该返回 0 的东西返回 nil。
  • 有点混乱。在代码中什么都没有返回。
【解决方案2】:

您应该检查选择器是否为 nil,以及该组件中是否至少有一个组件/行。

if let myPicker = myPicker,
    myPicker.numberOfComponents > 0,
    myPicker.numberOfRows(inComponent: 0) > 0 {
    myPicker.selectRow(0, inComponent: 0, animated: true)
}

或者,您可以使用布尔值“吞下”viewWillAppear 的第一次调用:

var firstViewWillAppearTime = true

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    if firstViewWillAppearTime {
        firstViewWillAppearTime = false
    } else {
        myPicker.selectRow(0, inComponent: 0, animated: true)
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多