Swift技术问题:多UITextField关联UIPickerView时数据刷新与读取异常
解决UITextField切换时UIPickerView数据源不刷新的问题
我来帮你搞定这个问题!这种情况几乎都是因为你没跟踪当前激活的文本框,也没在切换文本框时主动刷新PickerView的数据源。下面是一步步的解决方法:
第一步:添加变量跟踪当前活跃的文本框
在你的ViewController里定义一个变量,用来记录哪个文本框正在被编辑:var activeTextField: UITextField?第二步:设置文本框的代理并更新活跃状态
首先确保在viewDidLoad里把三个文本框的delegate都设为当前ViewController,同时也要把PickerView的数据源和代理关联好:override func viewDidLoad() { super.viewDidLoad() sexTextField.delegate = self goalTextField.delegate = self mealsTextField.delegate = self yourPickerView.dataSource = self yourPickerView.delegate = self }然后实现
textFieldDidBeginEditing代理方法,每次文本框开始编辑时,更新活跃变量并强制刷新PickerView:func textFieldDidBeginEditing(_ textField: UITextField) { activeTextField = textField yourPickerView.reloadAllComponents() }第三步:根据活跃文本框返回对应数据源
假设你已经为三个文本框准备了对应的数据源数组,比如:let sexOptions = ["Male", "Female"] let goalOptions = ["Lose Weight", "Gain Muscle", "Maintain"] let mealOptions = ["1", "2", "3", "4", "5"]现在修改PickerView的数据源方法,根据
activeTextField的类型返回对应的数据:func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { guard let currentTextField = activeTextField else { return 0 } switch currentTextField { case sexTextField: return sexOptions.count case goalTextField: return goalOptions.count case mealsTextField: return mealOptions.count default: return 0 } } func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { guard let currentTextField = activeTextField else { return nil } switch currentTextField { case sexTextField: return sexOptions[row] case goalTextField: return goalOptions[row] case mealsTextField: return mealOptions[row] default: return nil } }第四步:处理PickerView选中后的赋值
最后实现PickerView的选中代理方法,把选中的内容赋值给当前活跃的文本框,还可以顺便收起编辑状态:func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { guard let currentTextField = activeTextField else { return } switch currentTextField { case sexTextField: currentTextField.text = sexOptions[row] case goalTextField: currentTextField.text = goalOptions[row] case mealsTextField: currentTextField.text = mealOptions[row] default: break } // 选中后收起编辑状态,避免PickerView一直显示 currentTextField.resignFirstResponder() }
这样修改后,每次点击不同的文本框,PickerView都会自动切换到对应的数据源啦!
内容的提问来源于stack exchange,提问作者iMat
相关产品推荐
相关产品推荐

