根据第一个选择器中选择的行更改第二个和第三个 pickerView
Change the 2nd and 3rd pickerView acording to what row from the 1st picker is selected
我有3个这样的选择器:第一个是generalPicker,第二个和第三个是一样的。在 generalPicker 中,我有一个数组(菜单):["Length"、"Volume"、"Mass"] 每次我想选择时,例如来自 generalPicker 的 Mass,我想得到在第二个和第三个选择器中,这个数组:["Milligram"、"Centigram"、"Gram"、"Kilogram"、"Stone"、"Pound"、"Ounce"].
或者,如果我在 generalPicker 中选择 Length,那么我想进入第二个和第三个选择器:["Millimeter"、"Centimeter"、"Meter", "Kilometer"、"Foot"、"Yard"、"Mile"].
任何人都可以告诉我如何才能真正做到这一点吗?我的代码示例(选择器配置):
func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
if pickerView.tag == 0 || pickerView.tag == 1 {
return self.pickerLength.count
} else if pickerView.tag == 2 {
return self.pickerGeneral1.count
}
return 3
}
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
if pickerView.tag == 0 || pickerView.tag == 1{
return self.pickerLength[row]
} else if pickerView.tag == 2 {
return self.pickerGeneral1[row]
}
return ""
}
func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
if pickerView.tag == 0 {
self.pickerTextField.text = self.pickerLength[row]
self.view.endEditing(true)
}else if pickerView.tag == 1 {
self.pickedTextField2.text = self.pickerLength[row]
self.view.endEditing(true)
}else if pickerView.tag == 2 {
self.pickerGeneral.text = self.pickerGeneral1[row]
self.view.endEditing(true)
}
}
数组定义:
private var pickerMass = ["Milligram", "Centigram", "Gram", "Kilogram", "Stone", "Pound", "Ounce"]
private var pickerVolume = ["Milliliter", "Centiliter", "Liter", "Gallon", "Quart", "Pint", "Fluid ounce"]
private var pickerLength = ["Millimeter", "Centimeter", "Meter", "Kilometer", "Foot", "Yard", "Mile"]
private var pickerGeneral1 = ["Length", "Volume", "Mass"]
我认为您可以尝试使用字典而不是数组。 [ String : String array ] 类型的字典意味着您的字典键将包含类别(例如质量),而值将包含类别项目的数组(例如毫克、厘克 - 都链接到质量)。
var dictionary: [String:[String]] =
[
"length" : ["Millimeter", "Centimeter", "Meter", "Kilometer", "Foot", "Yard", "Mile"],
"mass" : ["Milligram", "Centigram", "Gram", "Kilogram", "Stone", "Pound", "Ounce"]
]
if let item = dictionary["length"] {
print(item)
} else {
print("not found")
}
以下是工作代码。这当然不是完成工作的好方法,但会提供解决问题的想法。
class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
@IBOutlet weak var textField_0: UITextField!
@IBOutlet weak var textField_1: UITextField!
@IBOutlet weak var textField_2: UITextField!
private var pickerGeneral1 = ["Length", "Volume", "Mass"]
// Maintaining the other arrays as single array of arrays for efficient loading
private var subContentArray = [["Millimeter", "Centimeter", "Meter", "Kilometer", "Foot", "Yard", "Mile"],
["Milliliter", "Centiliter", "Liter", "Gallon", "Quart", "Pint", "Fluid ounce"],
["Milligram", "Centigram", "Gram", "Kilogram", "Stone", "Pound", "Ounce"]]
var picker_0 = UIPickerView()
var picker_1 = UIPickerView()
var picker_2 = UIPickerView()
// To keep track of user's current selection from the main content array
private var _currentSelection: Int = 0
// whenever current selection is modified, we need to reload other pickers as their content depends upon the current selection index only.
var currentSelection: Int {
get {
return _currentSelection
}
set {
_currentSelection = newValue
picker_1 .reloadAllComponents()
picker_2 .reloadAllComponents()
textField_0.text = pickerGeneral1[_currentSelection]
textField_1.text = subContentArray[_currentSelection][0]
textField_2.text = subContentArray[_currentSelection][0]
}
}
override func viewDidLoad() {
super.viewDidLoad()
currentSelection = 0;
picker_0.delegate = self
picker_0.dataSource = self
picker_0.tag = 0
picker_1.delegate = self
picker_1.dataSource = self
picker_1.tag = 1
picker_2.delegate = self
picker_2.dataSource = self
picker_2.tag = 2
textField_0.inputView = picker_0
textField_1.inputView = picker_1
textField_2.inputView = picker_2
}
func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
if pickerView.tag == 0 {
return pickerGeneral1.count
} else {
return subContentArray[currentSelection].count
}
}
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
if pickerView.tag == 0 {
return pickerGeneral1[row]
} else {
return subContentArray[currentSelection][row]
}
}
func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
if pickerView.tag == 0 {
currentSelection = row
textField_0.text = pickerGeneral1[row]
textField_0.resignFirstResponder()
} else if pickerView.tag == 1 {
textField_1.text = subContentArray[currentSelection][row]
textField_1.resignFirstResponder()
} else if pickerView.tag == 2 {
textField_2.text = subContentArray[currentSelection][row]
textField_2.resignFirstResponder()
}
}
}
我将只使用一个 UIPickerView 而不是 3 个。
我有3个这样的选择器:第一个是generalPicker,第二个和第三个是一样的。在 generalPicker 中,我有一个数组(菜单):["Length"、"Volume"、"Mass"] 每次我想选择时,例如来自 generalPicker 的 Mass,我想得到在第二个和第三个选择器中,这个数组:["Milligram"、"Centigram"、"Gram"、"Kilogram"、"Stone"、"Pound"、"Ounce"].
或者,如果我在 generalPicker 中选择 Length,那么我想进入第二个和第三个选择器:["Millimeter"、"Centimeter"、"Meter", "Kilometer"、"Foot"、"Yard"、"Mile"].
任何人都可以告诉我如何才能真正做到这一点吗?我的代码示例(选择器配置):
func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
if pickerView.tag == 0 || pickerView.tag == 1 {
return self.pickerLength.count
} else if pickerView.tag == 2 {
return self.pickerGeneral1.count
}
return 3
}
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
if pickerView.tag == 0 || pickerView.tag == 1{
return self.pickerLength[row]
} else if pickerView.tag == 2 {
return self.pickerGeneral1[row]
}
return ""
}
func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
if pickerView.tag == 0 {
self.pickerTextField.text = self.pickerLength[row]
self.view.endEditing(true)
}else if pickerView.tag == 1 {
self.pickedTextField2.text = self.pickerLength[row]
self.view.endEditing(true)
}else if pickerView.tag == 2 {
self.pickerGeneral.text = self.pickerGeneral1[row]
self.view.endEditing(true)
}
}
数组定义:
private var pickerMass = ["Milligram", "Centigram", "Gram", "Kilogram", "Stone", "Pound", "Ounce"]
private var pickerVolume = ["Milliliter", "Centiliter", "Liter", "Gallon", "Quart", "Pint", "Fluid ounce"]
private var pickerLength = ["Millimeter", "Centimeter", "Meter", "Kilometer", "Foot", "Yard", "Mile"]
private var pickerGeneral1 = ["Length", "Volume", "Mass"]
我认为您可以尝试使用字典而不是数组。 [ String : String array ] 类型的字典意味着您的字典键将包含类别(例如质量),而值将包含类别项目的数组(例如毫克、厘克 - 都链接到质量)。
var dictionary: [String:[String]] =
[
"length" : ["Millimeter", "Centimeter", "Meter", "Kilometer", "Foot", "Yard", "Mile"],
"mass" : ["Milligram", "Centigram", "Gram", "Kilogram", "Stone", "Pound", "Ounce"]
]
if let item = dictionary["length"] {
print(item)
} else {
print("not found")
}
以下是工作代码。这当然不是完成工作的好方法,但会提供解决问题的想法。
class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
@IBOutlet weak var textField_0: UITextField!
@IBOutlet weak var textField_1: UITextField!
@IBOutlet weak var textField_2: UITextField!
private var pickerGeneral1 = ["Length", "Volume", "Mass"]
// Maintaining the other arrays as single array of arrays for efficient loading
private var subContentArray = [["Millimeter", "Centimeter", "Meter", "Kilometer", "Foot", "Yard", "Mile"],
["Milliliter", "Centiliter", "Liter", "Gallon", "Quart", "Pint", "Fluid ounce"],
["Milligram", "Centigram", "Gram", "Kilogram", "Stone", "Pound", "Ounce"]]
var picker_0 = UIPickerView()
var picker_1 = UIPickerView()
var picker_2 = UIPickerView()
// To keep track of user's current selection from the main content array
private var _currentSelection: Int = 0
// whenever current selection is modified, we need to reload other pickers as their content depends upon the current selection index only.
var currentSelection: Int {
get {
return _currentSelection
}
set {
_currentSelection = newValue
picker_1 .reloadAllComponents()
picker_2 .reloadAllComponents()
textField_0.text = pickerGeneral1[_currentSelection]
textField_1.text = subContentArray[_currentSelection][0]
textField_2.text = subContentArray[_currentSelection][0]
}
}
override func viewDidLoad() {
super.viewDidLoad()
currentSelection = 0;
picker_0.delegate = self
picker_0.dataSource = self
picker_0.tag = 0
picker_1.delegate = self
picker_1.dataSource = self
picker_1.tag = 1
picker_2.delegate = self
picker_2.dataSource = self
picker_2.tag = 2
textField_0.inputView = picker_0
textField_1.inputView = picker_1
textField_2.inputView = picker_2
}
func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
if pickerView.tag == 0 {
return pickerGeneral1.count
} else {
return subContentArray[currentSelection].count
}
}
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
if pickerView.tag == 0 {
return pickerGeneral1[row]
} else {
return subContentArray[currentSelection][row]
}
}
func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
if pickerView.tag == 0 {
currentSelection = row
textField_0.text = pickerGeneral1[row]
textField_0.resignFirstResponder()
} else if pickerView.tag == 1 {
textField_1.text = subContentArray[currentSelection][row]
textField_1.resignFirstResponder()
} else if pickerView.tag == 2 {
textField_2.text = subContentArray[currentSelection][row]
textField_2.resignFirstResponder()
}
}
}
我将只使用一个 UIPickerView 而不是 3 个。