我有两个UIPickerViews
:pickerOne
和pickerTwo
。 pickerTwo
的内容取决于在pickerOne
中选择的内容。每个选择器的所选项目的名称显示在UITextField
中。
依赖项的示例:
如果pickerOne
选择x
,则pickerTwo
将显示element1
,element2
和element3
。
如果pickerOne
选择y
,则pickerTwo
将显示element4
,element5
和element6
。
我使用以下代码执行此操作:
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
if pickerView === pickerOne {
textFieldOne.text = pickerOneData[row].name
pickerTwoData = // Update the data.
pickerTwo.selectRow(0, inComponent: 0, animated: false)
}
else if pickerView === pickerTwo {
textFieldTwo.text = pickerTwoData[row].name
}
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
if pickerView === pickerOne {
return pickerOneData[row].name
}
else if pickerView === pickerTwo {
return pickerTwoData[row].name
}
}
现在我的问题是,如果我在
pickerOne
中选择一行,而在pickerTwo
中只有一行,这些选择器的行为就会很奇怪。如果我在
pickerOne
中选择一行,在pickerTwo
中有几行,然后在pickerOne
中选择一行,在pickerTwo
中只有一行。然后,根据下一步操作,我会收到一个index out of range
错误。如果我关闭
UIPickerView
(self.view.endEditing(true)
)则没有问题,但是如果我只是选择pickerOne
中的行,而该行在pickerTwo
中只有一行。我怀疑这与在UIPickerView上向上滑动时播放的动画有关,这使其滚动,因为它直到停止滚动才更新文本字段。
如果有人能指出我正确的方向,我将不胜感激。
最佳答案
我设法修复了该错误,但我仍然很困惑。我更改了titleForRow
中的代码,现在它说:
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
if pickerView === pickerOne {
let name = pickerOneData[row].name
return name
}
else if pickerView === pickerTwo {
return pickerTwoData[row].name
}
}
我所做的只是首先将名称保存在变量中,然后它起作用了。
关于swift - UIPickerView与didSelect等待,直到完成滚动动画,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40589043/