Une petite question: sur un processus d'enregistrement, je voudrais demander à l'utilisateur de choisir une valeur dans une liste de valeurs.
Est-ce la bonne façon d'utiliser un contrôleur de vue en y ajoutant tous les champs de texte et pour les valeurs une vue de sélecteur? Comme la vue du sélecteur a besoin de tant d'espace entre les zones de texte, je me demande quelle serait la meilleure pratique dans ce cas?
c'est mon code jusqu'ici:
class RegisterViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource{
@IBOutlet weak var gradeTextField: UITextField!
@IBOutlet weak var gradePicker: UIPickerView!
let gradePickerValues = ["5. Klasse", "6. Klasse", "7. Klasse"]
func numberOfComponentsInPickerView(pickerView: UIPickerView!) -> Int{
return 1
}
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int{
return gradePickerValues.count
}
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
return gradePickerValues[row]
}
func pickerView(pickerView: UIPickerView!, didSelectRow row: Int, inComponent component: Int){
gradeTextField.text = gradePickerValues[row]
self.view.endEditing(true)
}
override func viewDidLoad() {
super.viewDidLoad()
statusMessageLabel.hidden = true
gradePicker.dataSource = self
gradePicker.delegate = self
gradePicker.hidden = true
gradeTextField.inputView = UIPickerView()
gradeTextField.text = gradePickerValues[0]
}
La vue d'ensemble du sélecteur est cachée au début et n'apparaît que lorsque je sélectionne le champ de texte, c'est bien jusqu'à présent ... Mais la vue du sélecteur est vide ...
Cela dépend de l'apparence du contrôleur. S'il n'y a qu'une seule action de choix par écran, il sera préférable de mettre Table View
Dessus et la ligne sélectionnée sera la sélection actuelle.
Si l'écran a plusieurs champs, cet utilisateur doit agir avec, alors, à mon avis, il est préférable de mettre label
+ button
au-dessus et lorsque l'utilisateur appuie sur button
vous venez de affiche Picker View
en bas de l'écran. Lorsque l'utilisateur sélectionne une ligne dans Picker View
, Vous modifiez le texte de l'étiquette, mais ne masquez pas le sélecteur lui-même, cela doit être fait en appuyant sur "Terminé" button
que vous placez au-dessus.
J'espère que cela t'aides.
Mise à jour:
Votre problème car vous avez juste oublié de définir la propriété dataSource
de UIPickerView
Faites juste: gradePicker.dataSource = self
Dans viewDidLoad()
Et n'oubliez pas d'implémenter le protocole ici: class RegisterViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource
mise à jour 2:
Enfin réussi. Si vous ajoutez UIPickerView
dans inputView de votre textFiled, il ne doit PAS être dans IB. Vous pouvez donc le supprimer du storyboard (ou .xib, si vous l'utilisez).
Ensuite, changez le code pour qu'il ressemble à ceci:
class RegisterViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
@IBOutlet weak var gradeTextField: UITextField!
var gradePicker: UIPickerView!
let gradePickerValues = ["5. Klasse", "6. Klasse", "7. Klasse"]
func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int{
return 1
}
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int{
return gradePickerValues.count
}
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
return gradePickerValues[row]
}
func pickerView(pickerView: UIPickerView!, didSelectRow row: Int, inComponent component: Int){
gradeTextField.text = gradePickerValues[row]
self.view.endEditing(true)
}
override func viewDidLoad() {
super.viewDidLoad()
gradePicker = UIPickerView()
gradePicker.dataSource = self
gradePicker.delegate = self
gradeTextField.inputView = gradePicker
gradeTextField.text = gradePickerValues[0]
}
}
Délégué du premier set
UIPickerViewDataSource,UIPickerViewDelegate
définir IBOutlet pour UIPickerView
@IBOutlet weak var pickerView: UIPickerView!
Prenez un tableau de données
var arrayFruits = [String]()
Écrivez ce code sur viewDidLoad ()
arrayFruits = ["Apple","Banana","Orange","Grapes","Watermelon"]
self.pickerView.dataSource = self
self.pickerView.delegate = self
Ecrire les méthodes de délégué de la vue du sélecteur:
//MARK: - Pickerview method
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return arrayFruits.count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return arrayFruits[row]
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
self.labelFruit.text = arrayFruits[row]
}
100% fonctionnel et testé