ios - how - UIPickerview mejores prácticas?
uipickerview add done button (2)
Depende de la apariencia del controlador. Si solo hay una acción de selección por pantalla, será mejor colocar Table View
en ella y la fila seleccionada será la selección actual.
Si la pantalla tiene múltiples campos, ese usuario debería actuar, entonces, en mi opinión, es mejor colocar el button
label
+ sobre ella y cuando el usuario presiona este button
, solo se muestra la Picker View
del Picker View
desde la parte inferior de la pantalla. Cuando el usuario selecciona una fila en la Picker View
selector, cambia el texto de la etiqueta, pero no oculte el selector, debe hacerlo presionando el button
"Listo" que colocó arriba.
Espero que esto ayude.
Actualización :
Tu problema porque simplemente te olvidaste de establecer la propiedad UIPickerView
de UIPickerView
Solo haz: gradePicker.dataSource = self
en viewDidLoad()
Y no olvide implementar el protocolo aquí: class RegisterViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource
Actualización 2 :
Finalmente lo hizo. Si agrega UIPickerView
en inputView de su TextFiled, NO debe estar en IB. Así que puedes eliminarlo del guión gráfico (o .xib, si lo usas).
Luego cambia el código para ser algo como esto:
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]
}
}
Una breve pregunta: en un proceso de registro, me gustaría pedirle al usuario que elija un valor de una lista de valores.
¿Es la forma correcta de usar un controlador de vista agregando allí todos los campos de texto y para los valores una vista de selector? Como la vista del selector necesita tanto espacio entre los campos de texto, me pregunto cuál sería la mejor práctica en este caso.
este es mi código hasta ahora:
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 vista de selección está oculta al principio y aparece solo cuando selecciono el campo de texto, esto está bien hasta ahora ... Pero la vista de selección está vacía ...
Primer conjunto delegado
UIPickerViewDataSource,UIPickerViewDelegate
establecer IBOutlet para UIPickerView
@IBOutlet weak var pickerView: UIPickerView!
Toma una matriz para datos
var arrayFruits = [String]()
Escriba este código en viewDidLoad ()
arrayFruits = ["Apple","Banana","Orange","Grapes","Watermelon"]
self.pickerView.dataSource = self
self.pickerView.delegate = self
Escriba los métodos de delegado de vista de selector
//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% funcionando y probado.