UIPickerView 最佳实践?
UIPickerView best practice?
一个简短的问题:在注册过程中,我想请用户从值列表中选择一个值。
使用视图控制器添加所有文本字段和选择器视图的值是否正确?由于选择器视图在文本字段区域之间需要如此多的 space 我想知道在这种情况下最佳实践是什么?
到目前为止,这是我的代码:
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]
}
选择器视图在开始时是隐藏的,只有当我 select 文本字段时才会出现,到目前为止这很好...但是选择器视图是空的...
这取决于控制器外观。如果每个屏幕只有一个选择操作,最好将 Table View
放在上面并且 selected 行将是当前 selection.
如果屏幕有多个字段,用户应该操作,那么,在我看来,最好把 label
+ button
放在上面,当用户按下这个 button
你只是从屏幕底部显示 Picker View
。当用户 select Picker View
中的任何行更改标签文本,但不隐藏选择器本身时,应该通过按 "Done" button
来完成。
希望这对您有所帮助。
更新:
你的问题是因为你忘记设置 dataSource
属性 of UIPickerView
只需做:gradePicker.dataSource = self
在 viewDidLoad()
别忘了在这里实现协议:class RegisterViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource
更新 2:
终于成功了。如果您在 textFiled 的 inputView 中添加 UIPickerView
,那么它不应该在 IB 中。所以你可以从情节提要中删除它(或者 .xib,如果你使用它)。
然后把代码改成这样:
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]
}
}
第一次设置代表
UIPickerViewDataSource,UIPickerViewDelegate
为 UIPickerView 设置 IBOutlet
@IBOutlet weak var pickerView: UIPickerView!
取数据数组
var arrayFruits = [String]()
在 viewDidLoad() 上写这段代码
arrayFruits = ["Apple","Banana","Orange","Grapes","Watermelon"]
self.pickerView.dataSource = self
self.pickerView.delegate = self
编写选择器视图委托方法:
//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% 工作并经过测试
一个简短的问题:在注册过程中,我想请用户从值列表中选择一个值。
使用视图控制器添加所有文本字段和选择器视图的值是否正确?由于选择器视图在文本字段区域之间需要如此多的 space 我想知道在这种情况下最佳实践是什么?
到目前为止,这是我的代码:
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]
}
选择器视图在开始时是隐藏的,只有当我 select 文本字段时才会出现,到目前为止这很好...但是选择器视图是空的...
这取决于控制器外观。如果每个屏幕只有一个选择操作,最好将 Table View
放在上面并且 selected 行将是当前 selection.
如果屏幕有多个字段,用户应该操作,那么,在我看来,最好把 label
+ button
放在上面,当用户按下这个 button
你只是从屏幕底部显示 Picker View
。当用户 select Picker View
中的任何行更改标签文本,但不隐藏选择器本身时,应该通过按 "Done" button
来完成。
希望这对您有所帮助。
更新:
你的问题是因为你忘记设置 dataSource
属性 of UIPickerView
只需做:gradePicker.dataSource = self
在 viewDidLoad()
别忘了在这里实现协议:class RegisterViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource
更新 2:
终于成功了。如果您在 textFiled 的 inputView 中添加 UIPickerView
,那么它不应该在 IB 中。所以你可以从情节提要中删除它(或者 .xib,如果你使用它)。
然后把代码改成这样:
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]
}
}
第一次设置代表
UIPickerViewDataSource,UIPickerViewDelegate
为 UIPickerView 设置 IBOutlet
@IBOutlet weak var pickerView: UIPickerView!
取数据数组
var arrayFruits = [String]()
在 viewDidLoad() 上写这段代码
arrayFruits = ["Apple","Banana","Orange","Grapes","Watermelon"]
self.pickerView.dataSource = self
self.pickerView.delegate = self
编写选择器视图委托方法:
//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% 工作并经过测试