尝试在UIPickerView中选择行时,如何捕获nil错误?

时间:2018-02-01 16:48:06

标签: swift uipickerview swift4 uivewcontroller

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

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

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

我不知道有什么区别。也许应用程序中还有其他内容。有没有办法捕获最初的nil而只是吞下它?它将模仿视图的第一次访问并将代码注释掉。在第一次访问视图后,nil将无法返回。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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