web-dev-qa-db-fra.com

UIPickerview meilleures pratiques?

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 ...

controller view with open picker view

18
user1555112

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]
    }
}
28
Alexander Zimin

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]
}

enter image description here

100% fonctionnel et testé

5
Mr.Javed Multani