UIPickerView 等待 didSelect 直到滚动动画完成
UIPickerView wait with didSelect until scrolling animation is done
我有两个 UIPickerViews
:pickerOne
和 pickerTwo
。 pickerTwo
的内容取决于 select 在 pickerOne
中编辑的内容。每个选择器的 selected 项的名称显示在 UITextField
.
中
一个依赖的例子:
如果pickerOne
selects x
,则pickerTwo
将显示element1
、element2
和element3
。
如果pickerOne
selects 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
中 select 一行而在 pickerTwo
中只有一行,那么这些选择器的行为会很奇怪。
如果我 select pickerOne
中的一行在 pickerTwo
中有几行,然后 select pickerOne
中只有一行的行pickerTwo
中的行。然后我可能会收到 index out of range
错误,具体取决于我接下来要做什么。
如果我关闭 UIPickerView
(self.view.endEditing(true)
) 则没有问题,但如果我只是 select 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
}
}
我所做的只是先将名称保存在一个变量中,然后它才起作用。
我有两个 UIPickerViews
:pickerOne
和 pickerTwo
。 pickerTwo
的内容取决于 select 在 pickerOne
中编辑的内容。每个选择器的 selected 项的名称显示在 UITextField
.
一个依赖的例子:
如果pickerOne
selects x
,则pickerTwo
将显示element1
、element2
和element3
。
如果pickerOne
selects 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
中 select 一行而在 pickerTwo
中只有一行,那么这些选择器的行为会很奇怪。
如果我 select pickerOne
中的一行在 pickerTwo
中有几行,然后 select pickerOne
中只有一行的行pickerTwo
中的行。然后我可能会收到 index out of range
错误,具体取决于我接下来要做什么。
如果我关闭 UIPickerView
(self.view.endEditing(true)
) 则没有问题,但如果我只是 select 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
}
}
我所做的只是先将名称保存在一个变量中,然后它才起作用。