ios UIPickerview 最佳实践?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/28630253/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
UIPickerview best practice?
提问by user1555112
One short question: on a registration process I would like to ask the user to choose a value from a list of values.
一个简短的问题:在注册过程中,我想请用户从值列表中选择一个值。
Is it the right way to use a view Controller adding there all text fields and for the values a picker view? As the picker view needs so much space in between the text fields area I wonder what the best practice in this case would be?
使用视图控制器添加所有文本字段和选择器视图的值是否正确?由于选择器视图在文本字段区域之间需要如此多的空间,我想知道在这种情况下的最佳实践是什么?
this is my code so far:
到目前为止,这是我的代码:
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]
}
The pickerview is hidden at the beginning and appears only when I select the text field, this is fine so far... But the the picker view is empty...
选择器视图一开始是隐藏的,只有当我选择文本字段时才会出现,到目前为止还好……但是选择器视图是空的……
回答by Alexander Zimin
It depends on controller appearance. If there only one choose action per screen it will be better to put Table View
on it and selected row will be current selection.
这取决于控制器的外观。如果每个屏幕只有一个选择操作,最好放在Table View
它上面,所选行将是当前选择。
If screen has multiply fields, that user should act with, then, in my opinion, it's better to put label
+ button
above it and when user press this button
you just shows Picker View
from screen bottom. When user select any row in Picker View
you change label text, but don't hide picker itself, it should be done by pressing "Done" button
you place above.
如果屏幕有多个字段,那么该用户应该采取行动,那么,在我看来,最好将label
+button
放在它上面,当用户按下它时,button
您只会Picker View
从屏幕底部显示。当用户选择Picker View
您更改标签文本中的任何行时,但不要隐藏选择器本身,应该通过按button
您放置在上方的“完成”来完成。
Hope this helps.
希望这可以帮助。
Update:
更新:
Your problem because you just forget to set dataSource
property of UIPickerView
你的问题,因为你只是忘记设置dataSource
属性UIPickerView
Just do: gradePicker.dataSource = self
in viewDidLoad()
只做:gradePicker.dataSource = self
在viewDidLoad()
And don't forget to implements protocol here: class RegisterViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource
并且不要忘记在这里实现协议: class RegisterViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource
Update 2:
更新2:
Finally made it. If you add UIPickerView
in inputView of your textFiled, then It should NOT be in IB. So you could remove it from storyboard (or .xib, if you use it).
终于做到了。如果您添加UIPickerView
textFiled 的 inputView,那么它不应该在 IB 中。所以你可以从故事板(或 .xib,如果你使用它)中删除它。
Then change code to be something like this:
然后将代码更改为如下所示:
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]
}
}
回答by Mr.Javed Multani
First set delegate
第一组委托
UIPickerViewDataSource,UIPickerViewDelegate
set IBOutlet for UIPickerView
为 UIPickerView 设置 IBOutlet
@IBOutlet weak var pickerView: UIPickerView!
Take an array for data
获取数据的数组
var arrayFruits = [String]()
Write this code on viewDidLoad()
在 viewDidLoad() 上编写此代码
arrayFruits = ["Apple","Banana","Orange","Grapes","Watermelon"]
self.pickerView.dataSource = self
self.pickerView.delegate = self
Write picker view delegate methods:
编写选择器视图委托方法:
//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% working and tested
100% 工作和测试