1

我有 3 个这样的选择器:第一个是 generalPicker,第二个和第三个是一样的。在 generalPicker 中,我有一个数组(菜单):[“Length”,“Volume”,“Mass”] 每次我想选择,例如来自 generalPicker 的 Mass,我想进入第二个和第三个选择器这个数组:["毫克"、"厘克"、"克"、"千克"、"石"、"磅"、"盎司"]。

或者,如果我在 generalPicker 中选择,比如说长度,那么我想进入第 2 和第 3 选择器:[“毫米”、“厘米”、“米”、“公里”、“英尺”、“码” , “英里”]。

谁能给我一个想法,我该怎么做?我的代码示例(选择器配置):

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"]
4

2 回答 2

4

以下是工作代码。这当然不是完成这项工作的好方法,但会给出解决问题的想法。

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 个。

于 2016-05-06T14:58:51.277 回答
-1

我认为您可以尝试使用字典而不是数组。[ 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")
}
于 2016-05-06T14:22:00.230 回答