我有两个UIPickerViewspickerOnepickerTwopickerTwo的内容取决于在pickerOne中选择的内容。每个选择器的所选项目的名称显示在UITextField中。

依赖项的示例:

如果pickerOne选择x,则pickerTwo将显示element1element2element3

如果pickerOne选择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中选择一行,而在pickerTwo中只有一行,这些选择器的行为就会很奇怪。

如果我在pickerOne中选择一行,在pickerTwo中有几行,然后在pickerOne中选择一行,在pickerTwo中只有一行。然后,根据下一步操作,我会收到一个index out of range错误。

如果我关闭UIPickerViewself.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/

10-14 23:05