同一个 UIView 中的多个 UIPickerView
Posted
技术标签:
【中文标题】同一个 UIView 中的多个 UIPickerView【英文标题】:Multiple UIPickerView in the same UIView 【发布时间】:2015-05-14 13:08:09 【问题描述】:我是 ios 开发的初学者,我想创建一个小的 iOS 应用程序。在这个应用程序中,3 个UIPickerViews
应该显示不同的数据。
我的问题出在显示器上。我习惯于在 android 或 Windows 手机上进行开发,但我不明白如何使用不同的数据填充 UIPickerViews
。
这是我已经写好的代码:
//
// ViewController.swift
// iphoneVersion
//
// Created by fselva on 13/05/2015.
// Copyright (c) 2015 fselva. All rights reserved.
//
import UIKit
class ViewController: UIViewController, UIPickerViewDelegate
@IBOutlet weak var pickerView1: UIPickerView!
@IBOutlet weak var pickerView2: UIPickerView!
@IBOutlet weak var pickerView3: UIPickerView!
var test = ["Todo","Waiting","Maybe","Inbox","Note"]
var test2 = ["@Office","@Computer","@Home","@Meeting", "@Read", "@Achat", "@Call"]
override func viewDidLoad()
super.viewDidLoad()
pickerView1.tag = 1
pickerView2.tag = 2
pickerView3.tag = 3
// Do any additional setup after loading the view, typically from a nib.
override func didReceiveMemoryWarning()
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
func numberOfComponentsInPickerView(pickerView : UIPickerView!) -> Int
return 1
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int
if pickerView2.tag == 2
return test.count
else if pickerView3 == 3
return test2.count
return 1
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String!
if pickerView2 == 2
return test[row]
else if pickerView3 == 3
return test2[row]
return ""
@IBOutlet weak var pickerView1: UIPickerView!
已通过 Ctrl+Click 从情节提要自动创建到 ViewController.swift。
第一个UIPickerView
当前应该什么都不显示。第二个应该显示test
,第三个显示test2
。
在互联网上进行了数小时的调查后,我听说了标签来定义谁必须显示什么,但它不起作用。
我是不是做错了什么,我是否在某处遗漏了什么?
【问题讨论】:
【参考方案1】:您不需要标签,只需使用:
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int
if pickerView == pickerView1
//pickerView1
else if pickerView == pickerView2
//pickerView2
也不要忘记在 IB 或代码中设置委托:
pickerView1.delegate = self
【讨论】:
感谢您的回答,我会检查一下代表是什么,以了解您告诉我的内容。此外,我会尝试你说的解决方案,谢谢。 将 pickerView1.delegate = self 放入 viewDidLoad() 易于实现,比创建新类更好。【参考方案2】:这是 Swift 3 中 TextField
中的完整源多个 UIPickerView
class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate
@IBOutlet weak var textFiel1: UITextField!
@IBOutlet weak var textFiel_2: UITextField!
let piker1 = UIPickerView()
let piker2 = UIPickerView()
let country = ["Ban","Ind","PK"]
let number = ["1","2","3"]
override func viewDidLoad()
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
piker1.dataSource = self
piker1.delegate = self
piker2.dataSource = self
piker2.delegate = self
piker1.tag = 1
piker2.tag = 2;
textFiel1.inputView = piker1
textFiel_2.inputView = piker2
override func didReceiveMemoryWarning()
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
func numberOfComponents(in pickerView: UIPickerView) -> Int
return 1
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int
if pickerView == piker1
return country.count
else if pickerView == piker2
return number.count
return 1
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?
if pickerView == piker1
return country[row]
else if pickerView == piker2
return number[row]
return ""
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)
if pickerView == piker1
textFiel1.text = country[row]
self.view.endEditing(false)
else if pickerView == piker2
textFiel_2.text = number[row]
self.view.endEditing(false)
【讨论】:
【参考方案3】:您正在将实例与标签进行比较。
替换:
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String!
if pickerView2 == 2
return test[row]
else if pickerView3 == 3
return test2[row]
return ""
与:
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String!
if pickerView2.tag == 2
return test[row]
else if pickerView3.tag == 3
return test2[row]
return ""
无论如何,您不需要标记您的选择器。选择器来自数据源和委托方法。您可以比较实例。像这样的:
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String!
if pickerView2 == pickerView
return test[row]
if pickerView3 == pickerView
return test2[row]
return ""
【讨论】:
感谢您的回答。错过的是代表。几个小时前我已经尝试过了,但没有成功,因为我没有做 pickerViewX.delegate = self.您的解决方案运行良好。【参考方案4】:我建议在控制器中定义一个变量,然后根据字段选择来决定值
func textFieldDidBeginEditing(_ textField: UITextField)
if(textField == self.txtAge)
**isAgeField=0**
self.pickUp(txtAge)
else
**isAgeField=1**
self.pickUpTimezone(timezonetxt)
`
then you can add condition inside the picker view as below
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int
if isAgeField == 1
return timeZoneList.count
else
return arrAge.count
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?
if isAgeField == 1
return timeZoneList[row]
else
return arrAge[row] as? String
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)
**if isAgeField == 1 **
timeZonepickerViewIndex = row
else
selectedIndex = row
【讨论】:
【参考方案5】:试试这个:
class UserConfig: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate
@IBOutlet weak var lblPeso: UILabel!
@IBOutlet weak var lblAlto: UILabel!
@IBOutlet weak var pickerView: UIPickerView!
@IBOutlet weak var btPeso: UIButton!
@IBOutlet weak var btAlto: UIButton!
var pulsado = 1
let userDefault = UserDefaults.standard
let pesoArray = [50,51,52,53,54,55,56,57,58,59,
60,61,62,63,64,65,66,67,68,69,
70,71,72,73,74,75,76,77,78,79,
80,81,82,83,84,85,86,87,88,89,
90,91,92,93,94,95,96,97,98,99,
100,101,102,103,104,105,106,107,108,109,
110,111,112,113,114,115,116,117,118,119,
120,121,122,123,124,125,126,127,128,120,
130]
let altoArray = [150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
160, 161, 162, 163, 164, 165, 166, 167, 168, 169,
170, 171, 172, 173, 174, 175, 176, 177, 178, 179,
180, 181, 182, 183, 184, 185, 186, 187, 188, 189,
190, 191, 192, 193, 194, 195, 196, 197, 198, 199,
200, 201, 202, 203, 204, 205, 206, 207, 208, 209,
210, 211, 212]
override func viewDidLoad()
super.viewDidLoad()
pickerView.delegate = self
pickerView.dataSource = self
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
self.view.endEditing(true)
@IBAction func volver(_ sender: Any)
self.dismiss(animated: true, completion: nil)
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int
if pulsado == 1
return altoArray.count
else
return pesoArray.count
func numberOfComponents(in pickerView: UIPickerView) -> Int
return 1
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?
if pulsado == 1
return String(format: "%i", altoArray[row])
else
return String(format: "%i", pesoArray[row])
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)
if pulsado == 1
lblAlto.text = String(format: "%i", altoArray[row])
else
lblPeso.text = String(format: "%i", pesoArray[row])
@IBAction func altoPressed(_ sender: Any)
pulsado = 1
pickerView.reloadAllComponents()
@IBAction func pesoPressed(_ sender: Any)
pulsado = 2
pickerView.reloadAllComponents()
【讨论】:
以上是关于同一个 UIView 中的多个 UIPickerView的主要内容,如果未能解决你的问题,请参考以下文章