iOS中如何将两个PickerView分别与对应Label关联显示选中内容?
解决两个UIPickerView对应各自UILabel独立显示的问题
这个问题的核心是你当前的代理方法没有区分触发事件的是哪一个PickerView,导致不管操作哪个,两个Label都会被设置成相同内容。我们只需要在代理回调里判断PickerView实例,再给对应的Label赋值就能解决。
步骤1:确保第二个Label的IBOutlet已正确连接
首先确认第二个Label已经通过Storyboard/XIB绑定到ViewController,添加对应的IBOutlet属性:
@IBOutlet weak var valuetype2: UILabel!
(别忘了同时确认picker1和picker2的IBOutlet也已正确连接哦)
步骤2:修改didSelectRow代理方法
在这个回调里,我们通过pickerView参数判断当前操作的是哪个选择器,然后针对性地更新Label内容:
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { let selectedText = pickerData[row] if pickerView == picker1 { valuetype1.text = selectedText } else if pickerView == picker2 { valuetype2.text = selectedText } }
或者用更简洁的switch写法也可以:
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { let selectedText = pickerData[row] switch pickerView { case picker1: valuetype1.text = selectedText case picker2: valuetype2.text = selectedText default: break } }
步骤3:初始化时设置默认内容(可选但推荐)
为了避免页面刚加载时Label为空,建议在viewDidLoad里给两个Label设置默认选中行的内容:
override func viewDidLoad() { super.viewDidLoad() self.picker1.delegate = self self.picker1.dataSource = self self.picker2.delegate = self self.picker2.dataSource = self pickerData = ["Годы", "Месяцы", "Недели", "Дни", "Часы", "Минуты"] // 设置初始显示的默认内容 valuetype1.text = pickerData[0] valuetype2.text = pickerData[0] }
完整修改后的代码
@IBOutlet weak var valuetype1: UILabel! @IBOutlet weak var valuetype2: UILabel! @IBOutlet weak var picker1: UIPickerView! @IBOutlet weak var picker2: UIPickerView! var pickerData: [String] = [String]() override func viewDidLoad() { super.viewDidLoad() self.picker1.delegate = self self.picker1.dataSource = self self.picker2.delegate = self self.picker2.dataSource = self pickerData = ["Годы", "Месяцы", "Недели", "Дни", "Часы", "Минуты"] // 初始化默认显示内容 valuetype1.text = pickerData[0] valuetype2.text = pickerData[0] } func numberOfComponents(in pickerView: UIPickerView) -> Int { return 1 } func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { return pickerData.count } func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { return pickerData[row] } func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { let selectedContent = pickerData[row] // 判断当前操作的PickerView实例 switch pickerView { case picker1: valuetype1.text = selectedContent case picker2: valuetype2.text = selectedContent default: break } }
这样修改后,picker1的选中内容会独立显示在valuetype1中,picker2的选中内容会显示在valuetype2中,两个选择器的操作就互不影响了。
内容的提问来源于stack exchange,提问作者Ivan Kisin
相关产品推荐
相关产品推荐

