调用PickerView的selectRow为何无法触发didSelectRowAt代理方法?
为什么调用
selectRow不会触发didSelectRowAt? 这个问题我之前也碰到过!其实是UIPickerView的设计特性导致的——Apple官方设定:selectRow(_:inComponent:animated:)仅用来设置PickerView的选中状态,并不会自动触发pickerView(_:didSelectRow:inComponent:)代理方法,这个代理方法只有用户手动滚动选择行的时候才会被系统调用。
解决办法
有两种常用方案,推荐第二种,代码更整洁易维护:
1. 手动调用代理方法
在调用selectRow之后,直接手动触发代理方法,让文本框禁用逻辑执行:
// 设置Picker选中第0行 myPicker.selectRow(0, inComponent: 0, animated: true) // 手动调用代理方法,触发文本框状态更新 pickerView(myPicker, didSelectRow: 0, inComponent: 0)
2. 抽离独立的逻辑方法(推荐)
把“根据选中行调整文本框状态”的逻辑抽成单独方法,不管是用户手动选择还是代码设置选中,都调用这个方法,避免重复代码:
// 抽离的逻辑方法:根据选中行更新文本框启用状态 private func updateTextFieldEnabledState(forRow row: Int) { // 根据你的业务逻辑调整判断条件,示例为选中第0行时禁用文本框 textField.isEnabled = row != 0 } // 代理方法中调用逻辑 func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { updateTextFieldEnabledState(forRow: row) } // 代码设置选中行时,同样调用逻辑 myPicker.selectRow(0, inComponent: 0, animated: true) updateTextFieldEnabledState(forRow: 0)
这种方式的优势在于,后续如果要修改文本框的启用规则,只需要改动updateTextFieldEnabledState(forRow:)这一处,维护成本更低。
内容的提问来源于stack exchange,提问作者atalayasa
相关产品推荐
相关产品推荐

