UIPickerView 等待 didSelect 直到滚动动画完成

UIPickerView wait with didSelect until scrolling animation is done

我有两个 UIPickerViewspickerOnepickerTwopickerTwo 的内容取决于 select 在 pickerOne 中编辑的内容。每个选择器的 selected 项的名称显示在 UITextField.

一个依赖的例子:

如果pickerOne selects x,则pickerTwo将显示element1element2element3

如果pickerOneselects y,则pickerTwo将显示element4element5element6

我使用以下代码来执行此操作:

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

我所做的只是先将名称保存在一个变量中,然后它才起作用。