尝试在 UIPickerView 中 select 一行时如何捕获 nil 错误?
How can I catch a nil error when trying to select a row in a UIPickerView?
显然,如果您尝试从 viewWillAppear
中的 UIPickerView
中获取元素,第一次视图为 运行 时,应用程序将崩溃并返回 nil
错误。
如果我注释掉以下行和 运行 应用程序,一切正常。然后我取消注释下面的行并再次 运行,它工作正常并且继续工作正常。
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
myPicker.selectRow(0, inComponent: 0, animated: true)
}
我不知道有什么区别。也许应用程序中还有其他事情发生。有没有办法抓住最初的 nil
并吞下它?它将模仿视图的第一次访问并将代码注释掉。第一次访问视图后,nil
不会返回。
您应该检查选择器是否为 nil 以及它是否在该组件中至少有一个 component/row。
if let myPicker = myPicker,
myPicker.numberOfComponents > 0,
myPicker.numberOfRows(inComponent: 0) > 0 {
myPicker.selectRow(0, inComponent: 0, animated: true)
}
或者,您可以 "swallow" 使用布尔值 viewWillAppear
的第一个调用:
var firstViewWillAppearTime = true
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if firstViewWillAppearTime {
firstViewWillAppearTime = false
} else {
myPicker.selectRow(0, inComponent: 0, animated: true)
}
}
如果选择器默认声明为隐式解包可选,只需可选链即可:
myPicker?.selectRow(0, inComponent: 0, animated: true)
显然,如果您尝试从 viewWillAppear
中的 UIPickerView
中获取元素,第一次视图为 运行 时,应用程序将崩溃并返回 nil
错误。
如果我注释掉以下行和 运行 应用程序,一切正常。然后我取消注释下面的行并再次 运行,它工作正常并且继续工作正常。
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
myPicker.selectRow(0, inComponent: 0, animated: true)
}
我不知道有什么区别。也许应用程序中还有其他事情发生。有没有办法抓住最初的 nil
并吞下它?它将模仿视图的第一次访问并将代码注释掉。第一次访问视图后,nil
不会返回。
您应该检查选择器是否为 nil 以及它是否在该组件中至少有一个 component/row。
if let myPicker = myPicker,
myPicker.numberOfComponents > 0,
myPicker.numberOfRows(inComponent: 0) > 0 {
myPicker.selectRow(0, inComponent: 0, animated: true)
}
或者,您可以 "swallow" 使用布尔值 viewWillAppear
的第一个调用:
var firstViewWillAppearTime = true
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if firstViewWillAppearTime {
firstViewWillAppearTime = false
} else {
myPicker.selectRow(0, inComponent: 0, animated: true)
}
}
如果选择器默认声明为隐式解包可选,只需可选链即可:
myPicker?.selectRow(0, inComponent: 0, animated: true)