import UIKit
// Contenu du PickerView
fileprivate let listeDesFruits = [
"Pomme",
"Cerise",
"Ananas",
"Kiwi",
"Banane"]
class ViewController: UIViewController,
UIPickerViewDelegate,
UIPickerViewDataSource {
@IBOutlet weak var pickerView: UIPickerView!
@IBOutlet weak var label: UILabel!
// Initialisation viewController
override func viewDidLoad() {
super.viewDidLoad()
pickerView.dataSource = self
pickerView.delegate = self
}
// ---------
// MARK : Remplissage du PickView
// Une seule colonne (cas le plus fréquent)
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
// Nombre de lignes
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return listeDesFruits.count
}
// Remplissage de chaque ligne
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return listeDesFruits[row]
}
// -------------
// Delegate du Picker View
// Cette méthode est appelée APRES la sélection d'un élément du Picker
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
// Lecture élément
let selection = listeDesFruits[row]
// Affichage dans la fenêtre Xcode
print ("--")
print ("ligne : ", row)
print ("colonne : ", component)
print ("Fruit : ", selection)
// Affichage sur l'écran avec un Label
label.text = selection
label.sizeToFit()
}
}
Lorsque le doigt de l’utilisateur relâche le pickView, il appelle automatiquement la méthode suivante en lui passant les paramètres de sélection :
row : ligne sélectionnée component : colonne sélectionnée
Il suffit de lire le tableau contenant la structure du pickerView pour connaître la valeur sélectionnée.
// Cette méthode est appelée APRES la sélection d'un élément du Picker
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
// Lecture élément
let selection = listeDesFruits[row]
// Faire quelque chose avec la sélection
// .......
}
Merci pour vos réponses, çà fonctionne pour un UIPickerView et un component ou wheel.
Mais comment le faire si j’intègre 3 wheels dans le même UIPickerView et que selon les choix pour chaque wheel, çà dirige vers un nouveau ViewController, donc une nouvelle page ?
Merci d’avance …
Petite démo avec un viewPicker à deux composants (fruit/couleur). L’application mémorise les choix de l’utilisateur dans des variables. Un bouton « Valider le choix » permet d’appeler le viewControler correspondant.
Pas forcément. Si le nombre de choix est important, il est préférable de tout stocker dans un tableau (fruit/couleur/référence au viewControler) et d’utiliser une boucle pour rechercher une combinaison particulière.
Un amoncellement de plusieurs dizaines de tests imbriqués est un magnifique nid à bugs.
Parce que j’aime bien séparer la partie “déclarative” des données, de la partie “lignes de code”. Je trouve ça plus lisible, surtout pour un exemple pédagogique.
Normalement c’est une mauvaise idée, les variables globales étant visibles dans la totalité des fichiers de l’application. Pas top pour la sécurité et l’indépendance des classes.
Mais fileprivate est un attribut spécial signifiant “ceci est privé à ce fichier de code. Les autres fichiers de l’application ne peuvent y accéder”. Seul le viewControler de ce fichier peut y avoir accès.