将 UIPickerView 视为组合/选择框

Posted

技术标签:

【中文标题】将 UIPickerView 视为组合/选择框【英文标题】:Treat an UIPickerView like a combo/select box 【发布时间】:2017-03-26 15:35:32 【问题描述】:

我正在使用 XCode 8.2.1Swift 3iOS10

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

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 后会做其他事情,这就是我需要它的原因。

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

谢谢!

【问题讨论】:

显示您尝试过的易于优化的代码 【参考方案1】:

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

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

【讨论】:

非常感谢 Leo,您的解决方案完美运行! :D【参考方案2】:

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

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

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

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

var namesArray: [NameTuple]

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

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

【讨论】:

您应该以大写字母开头命名您的类型别名 @LeoDabus - 顺便说一句,混合 Swift/Objective-C 应用程序中类型的命名约定是什么?在 Objective-C 中,非类类型名称应该以小写字母开头,而在 Swift 中,所有类型都应该以大写字母开头。 我想我会使用 Swift 命名约定,因为 Swift 是未来的潮流,而 Objective-C 的日子屈指可数。

以上是关于将 UIPickerView 视为组合/选择框的主要内容,如果未能解决你的问题,请参考以下文章

如何根据组合框选择更改 UI

UIPickerView 选择和隐藏

自动选择单一匹配jQuery UI自动完成组合框

UiPickerview 值在 swift 中显示为问号(“?”) - 但是在将其分配给文本框时获得正确的值

在 UIPickerView 上选择行时如何使用信息填充第二个视图控制器

使用滑块连接组合框