将UIPickerView视为组合/选择框

时间:2017-03-26 15:35:33

标签: ios arrays swift combobox uipickerview

我正在使用 XCode 8.2.1 Swift 3 iOS10

我有一个项目列表,格式如下:

ID | Name
---------
1 | John
2 | Maria
3 | Peter
4 | Roger

代码如下所示:

var formsList = [1:"John", 2:"Maria", 3:"Peter", 4:"Roger"]

我想要做的是将该数据设置为UIPickerView ,因此当有人选择例如John时, ID 1 返回,或者如果有人选择Peter,则返回ID 3。

一旦我获得了ID,我会做其他事情,这就是我需要它的原因。

关于如何实现这一目标的任何想法或建议?

谢谢!

2 个答案:

答案 0 :(得分:2)

使用数据结构字典的方法存在问题。根据设计,字典是无序的。

有很多方法可以做到这一点。大多数都涉及创建某种类型的数组,其中包含您希望用户从中选择的每个条目的项目。

例如,创建一个元组数组:

typealias NameTuple = (id: Int, name: String)

var namesArray: [NameTuple]

使用数组中每个条目的名称字段提取选择器视图。当用户选择项目时,使用选定的索引获取该元组,然后获取ID。

您还可以使用结构数组或名称对象数组。

答案 1 :(得分:2)

您只需按键对字典进行排序,并将其用作选择器数据源:

let formsList = [1:"John", 2:"Maria", 3:"Peter", 4:"Roger"]
let dataSource = formsList.sorted{$0.key<$1.key}

通过这种方式,您可以将所有字典名称排序在包含其ID的数组中。你的选择器应该是这样的:

class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
    @IBOutlet weak var pickerView: UIPickerView!
    @IBOutlet weak var label: UILabel!
    let formsList = [1:"John", 2:"Maria", 3:"Peter", 4:"Roger"]
    var dataSource: [(key: Int, value: String)] = []
    override func viewDidLoad() {
        super.viewDidLoad()
        dataSource = formsList.sorted{$0.key<$1.key}
        pickerView.delegate = self
        pickerView.dataSource = self
        label.text = "id: " + String(dataSource[pickerView.selectedRow(inComponent: 0)].key) + " - " + "name: " + dataSource[pickerView.selectedRow(inComponent: 0)].value
    }
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return dataSource.count
    }
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return dataSource[row].value
    }
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        label.text = "id: " + String(dataSource[row].key) + " - " + "name: " + dataSource[row].value
    }
}

sample