You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 00:06:05