Xcode 13.1中UIPickerView选中值后跳转至非目标项如何解决?
问题原因与解决方案
1. 打印逻辑错误
你当前将打印行号的逻辑放在了pickerView(_:titleForRow:forComponent:)代理方法中,这个方法是UIPickerView渲染每行显示文本时触发的,滚动过程中会多次调用,输出的是当前待渲染的行序号,不是用户最终选中的行序号。你看到的打印6只是滚动到Item1过程中系统需要渲染第6行内容,并不代表选中了第6行。
如果要获取用户最终选中的行,必须实现UIPickerViewDelegate的pickerView(_:didSelectRow:inComponent:)代理方法,该方法会在用户停止滚动、选中某一行后触发。
2. 选中跳行的修复方案
如果确实存在选中某行后自动跳转至其他行的现象,本质原因是UIPickerView的行高和控件布局不匹配,导致点击识别区域和实际显示的行错位,你需要手动指定行高,实现行高代理方法即可解决。
修正后的完整代码
import UIKit class LengthViewController: UIViewController { @IBOutlet weak var pickerView: UIPickerView! let pickerData = ["Item 0","Item 1", "Item 2", "Item 3", "Item 4", "Item 5", "Item 6", "Item 7", "Item 8","Item 9"] override func viewDidLoad() { super.viewDidLoad() pickerView.delegate = self pickerView.dataSource = self } } extension LengthViewController: UIPickerViewDelegate{ // 渲染每行文本 func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { return pickerData[row] } // 手动指定行高,避免点击错位 func pickerView(_ pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat { return 44 // 可根据你的UI需求调整数值 } // 监听选中事件,这里打印的才是最终选中的行号 func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { print("选中的行号:\(row),选中内容:\(pickerData[row])") } } extension LengthViewController: UIPickerViewDataSource{ func numberOfComponents(in pickerView: UIPickerView) -> Int { return 1 } func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { return pickerData.count } }
内容的提问来源于stack exchange,提问作者RonDavid
相关产品推荐
相关产品推荐

