Ios 将UIPickerView视为组合/选择框

Ios 将UIPickerView视为组合/选择框,ios,arrays,swift,combobox,uipickerview,Ios,Arrays,Swift,Combobox,Uipickerview,我正在使用XCode 8.2.1、swift3和iOS10 我有一个项目列表,格式如下: ID | Name --------- 1 | John 2 | Maria 3 | Peter 4 | Roger 代码如下所示: var formsList = [1:"John", 2:"Maria", 3:"Peter", 4:"Roger"] class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDa

我正在使用XCode 8.2.1swift3iOS10

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

ID | Name
---------
1 | John
2 | Maria
3 | Peter
4 | Roger
代码如下所示:

var formsList = [1:"John", 2:"Maria", 3:"Peter", 4:"Roger"]
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
    }
}
我想做的是将该数据设置为UIPickerView,这样当有人选择例如John时,ID1将返回,或者如果有人选择Peter,ID 3将返回

一旦我拿到身份证,我会做其他事情,这就是为什么我需要它

关于如何实现这一点,有什么想法或建议吗


谢谢

使用数据结构字典的方法是有问题的。字典的设计是无序的

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

例如,创建元组数组:

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

var namesArray: [NameTuple]
为选择器视图提供数组中每个条目的名称字段。当用户选择一项时,使用所选索引获取该元组,然后获取ID


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

您使用数据结构字典的方法是有问题的。字典的设计是无序的

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

例如,创建元组数组:

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

var namesArray: [NameTuple]
为选择器视图提供数组中每个条目的名称字段。当用户选择一项时,使用所选索引获取该元组,然后获取ID


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

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

let formsList = [1:"John", 2:"Maria", 3:"Peter", 4:"Roger"]
let dataSource = formsList.sorted{$0.key<$1.key}
let formsList=[1:“约翰”,2:“玛丽亚”,3:“彼得”,4:“罗杰”]
让dataSource=formsList.sorted{$0.key Int{
返回dataSource.count
}
func pickerView(pickerView:UIPickerView,titleForRow行:Int,forComponent组件:Int)->String{
返回数据源[row]。值
}
func pickerView(pickerView:UIPickerView,didSelectRow行:Int,不完整组件:Int){
label.text=“id:”+String(数据源[row].key)+“-“+”名称:“+dataSource[row].value
}
}

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

let formsList = [1:"John", 2:"Maria", 3:"Peter", 4:"Roger"]
let dataSource = formsList.sorted{$0.key<$1.key}
let formsList=[1:“约翰”,2:“玛丽亚”,3:“彼得”,4:“罗杰”]
让dataSource=formsList.sorted{$0.key Int{
返回dataSource.count
}
func pickerView(pickerView:UIPickerView,titleForRow行:Int,forComponent组件:Int)->String{
返回数据源[row]。值
}
func pickerView(pickerView:UIPickerView,didSelectRow行:Int,不完整组件:Int){
label.text=“id:”+String(数据源[row].key)+“-“+”名称:“+dataSource[row].value
}
}

显示您的试用代码优化很容易显示您的试用代码优化很容易感谢Leo,您的解决方案工作得非常好!:非常感谢Leo,你的解决方案非常有效你应该以大写字母开始命名你的TypeAliasletter@LeoDabus-顺便问一下,Swift/Objective-C混合应用程序中类型的命名约定是什么?在Objective-C中,非类类型名称应该以小写字母开头,而在Swift中,所有类型都应该以大写字母开头。我想我应该使用Swift命名约定,因为Swift是未来的潮流,Objective-C的日子屈指可数。您应该以大写字母开始命名您的类型别名letter@LeoDabus-作为旁白,混合Swift/Objective-C应用程序中的类型命名约定是什么?在Objective-C中,非类类型名称应该以小写字母开头,而在Swift中,所有类型都应该以大写字母开头。我想我应该使用Swift命名约定,因为Swift是未来的潮流,Objective-C的日子屈指可数。