如何强制UIPickerView.selectRow调用didSelectRow方法?

How to force UIPickerView.selectRow call didSelectRow method?

是否可以调用func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)方法,当运行UIPickerView.selectRow(4, inComponent: 0, animated: false)

或者存档的正确方法是什么?

我的实现

let pickerView = UIPickerView()

pickerView.delegate = self
pickerView.dataSource = self
pickerView.selectRow(0, inComponent: 0, animated: false)
textField.inputView = pickerView

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {

}

这到select行

 self.yourPickerViewName.selectRow(2, inComponent: 0, animated: true)

这是触发方法

 self.pickerView(self.yourPickerViewName, didSelectRow: 2, inComponent: 0)

将它们结合起来模拟用户操作

当您以编程方式 select 一行时,func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) 未被调用绝对不是错误。文档说:

Called by the picker view when the user selects a row in a component.

这是一个委托方法,仅当用户 select 连续一行时才会调用。所以如果你 select 这样一行,它自然不会被调用:

pickerView.selectRow(0, inComponent: 0, animated: false) 

您接受的答案中的 hack 有效,但从您的视图控制器调用委托方法不是好的做法。我建议您创建另一种方法,该方法将在用户或以编程方式 select 编辑行时执行您想要的操作:

例如

func doStuff(for row: Int, component: Int) {
    // Do your stuff here
}

然后在你的委托方法中:

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    doStuff(for: row, component: component)
}

并且当您以编程方式 select 一行时:

pickerView.selectRow(0, inComponent: 0, animated: false)
doStuff(for: 0, component: 0)

如果您需要在 doStuff 方法中对 pickerView 执行某些操作,您可以添加另一个参数并在调用时传递它,或者直接访问 pickerView 变量。