2017-03-26 1 views
0

Je travaille avec XCode 8.2.1, Swift 3 et iOS10.Traiter un UIPickerView comme un combo/boîte de sélection

J'ai une liste des articles avec le format suivant:

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

Le code ressemble à ceci:

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

Ce que je veux faire est de ensemble que les données en UIPickerView, donc quand quelqu'un choisit par exemple John, le ID 1 est retourné, ou si s quelqu'un choisit Peter, l'ID 3 est retourné.

Je fais d'autres choses une fois que je reçois cet ID, c'est pourquoi j'en ai besoin.

Une idée ou une suggestion sur la façon dont je peux y parvenir?

Merci!

+0

montrer le code ur essayé, il est facile d'optimiser –

Répondre

2

Il vous suffit de trier votre dictionnaire par ses clés et l'utiliser comme source de données de sélecteur:

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

De cette façon, vous avez tous vos noms de dictionnaire classés dans un tableau comprenant leurs papiers d'identité. Votre sélecteur devrait ressembler à ceci:

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

+1

Merci beaucoup Leo, votre solution a parfaitement fonctionné! : D – Lucas

+0

De rien –

2

Votre approche de l'utilisation d'un dictionnaire de votre structure de données est problématique. Les dictionnaires sont, par conception, non ordonnés.

Il existe de nombreuses façons de procéder. La plupart impliquent la création d'un tableau contenant des éléments pour chaque entrée à partir de laquelle vous voulez que l'utilisateur sélectionne.

Par exemple, créer un tableau de tuples:

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

var namesArray: [NameTuple] 

Nourrissez votre vue sélecteur avec le champ de nom de chaque entrée dans votre tableau. Lorsque l'utilisateur sélectionne un élément, utilisez l'index sélectionné pour récupérer ce tuple et obtenir l'ID.

Vous pouvez également utiliser un tableau de structures ou un tableau d'objets de noms.

+0

Vous devez appeler votre typealiases en commençant par une lettre majuscule –

+0

Bon point. J'oublie toujours ça parfois. Fixé. –

+0

@LeoDabus - en aparté, quelle est la convention de nommage pour les types dans une application mixte Swift/Objective-C? Dans Objective-C, les noms de type hors classe doivent commencer par une lettre minuscule, tandis que dans Swift, tous les types doivent commencer par une lettre majuscule. –