在同一视图上添加第二个 UIPickerView 时出现问题 ViewController
Issue with adding second UIPickerView on the same view ViewController
本质上,我只是想向我的 ViewController 添加第二个 UIPickerView,但不明白为什么以下代码可以正常工作。
选择第二个文本字段时 stopTextField 我希望 stopPicker UIPickerView 出现,但是 gradePicker UIPickerView 出现了。
似乎编译得很好,但完全忽略了:
let stopPickerValues = ["What Stop?","Stop 1", "Stop 2", "Stop 3", "Stop 4", "Stop 5", "Stop 6", "Stop 7", "Stop 8", "Stop 9", "Stop 10"]
问题是什么?
代码如下:
import UIKit
class timeselectviewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
@IBOutlet weak var gradeTextField: UITextField!
@IBOutlet weak var stopTextField: UITextField!
var gradePicker: UIPickerView!
var stopPicker: UIPickerView!
let gradePickerValues = ["select approximate arrival time","8:00 am -12:00 pm", "12:00 pm - 4:00 pm", "4:00 pm - 8:00 pm"]
let stopPickerValues = ["What Stop?","Stop 1", "Stop 2", "Stop 3", "Stop 4", "Stop 5", "Stop 6", "Stop 7", "Stop 8", "Stop 9", "Stop 10"]
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func numberOfComponents2(in pickerView2: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int{
return gradePickerValues.count
}
func pickerView2(_ pickerView2: UIPickerView, numberOfRowsInComponent2 component2: Int) -> Int{
return stopPickerValues.count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return gradePickerValues[row]
}
func pickerView2(_ pickerView2: UIPickerView, titleForRow2 row2: Int, forComponent2 component2: Int) -> String? {
return stopPickerValues[row2]
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
gradeTextField.text = gradePickerValues[row]
self.view.endEditing(true)
}
func pickerView2(_ pickerView2: UIPickerView, didSelectRow2 row2: Int, inComponent2 component2: Int) {
stopTextField.text = stopPickerValues[row2]
self.view.endEditing(true)
}
override func viewDidLoad() {
super.viewDidLoad()
gradePicker = UIPickerView()
stopPicker = UIPickerView()
gradePicker.dataSource = self
stopPicker.dataSource = self
gradePicker.delegate = self
stopPicker.delegate = self
stopTextField.inputView = stopPicker
gradeTextField.inputView = gradePicker
gradeTextField.text = gradePickerValues[0]
stopTextField.text = stopPickerValues[0]
}
}
你可以这样做:
var pickerView: UIPickerView!
...
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int{
if gradeTextField.isFirstResponder {
return gradePickerValues.count
} else {
return stopPickerValues.count
}
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
if gradeTextField.isFirstResponder {
return gradePickerValues[row]
} else {
return stopPickerValues[row]
}
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
if gradeTextField.isFirstResponder {
gradeTextField.text = gradePickerValues[row]
} else {
stopTextField.text = stopPickerValues[row]
}
self.view.endEditing(true)
}
override func viewDidLoad() {
super.viewDidLoad()
pickerView = UIPickerView()
pickerView.dataSource = self
pickerView.delegate = self
stopTextField.inputView = pickerView
gradeTextField.inputView = pickerView
gradeTextField.text = gradePickerValues[0]
stopTextField.text = stopPickerValues[0]
}
问题是您的 pickerView2
方法被忽略了。我在上面发布的方式检查哪个文本字段是执行所需操作的第一响应者或 return 正确的值。
编辑
正如 rmaddy 所指出的,您只需要一个选择器视图,因为您一次只能将一个文本字段作为第一响应者。
我同意@ajeferson 的回答,但如果您仍想同时使用这两个选择器视图,请试试这个:
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int{
if pickerView == gradePicker{
return gradePickerValues.count
}
else{
return stopPickerValues.count
}
}
delegate和datasource方法都提供了UIPickerView的各个对象,方便我们使用。
本质上,我只是想向我的 ViewController 添加第二个 UIPickerView,但不明白为什么以下代码可以正常工作。
选择第二个文本字段时 stopTextField 我希望 stopPicker UIPickerView 出现,但是 gradePicker UIPickerView 出现了。
似乎编译得很好,但完全忽略了:
let stopPickerValues = ["What Stop?","Stop 1", "Stop 2", "Stop 3", "Stop 4", "Stop 5", "Stop 6", "Stop 7", "Stop 8", "Stop 9", "Stop 10"]
问题是什么?
代码如下:
import UIKit
class timeselectviewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
@IBOutlet weak var gradeTextField: UITextField!
@IBOutlet weak var stopTextField: UITextField!
var gradePicker: UIPickerView!
var stopPicker: UIPickerView!
let gradePickerValues = ["select approximate arrival time","8:00 am -12:00 pm", "12:00 pm - 4:00 pm", "4:00 pm - 8:00 pm"]
let stopPickerValues = ["What Stop?","Stop 1", "Stop 2", "Stop 3", "Stop 4", "Stop 5", "Stop 6", "Stop 7", "Stop 8", "Stop 9", "Stop 10"]
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func numberOfComponents2(in pickerView2: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int{
return gradePickerValues.count
}
func pickerView2(_ pickerView2: UIPickerView, numberOfRowsInComponent2 component2: Int) -> Int{
return stopPickerValues.count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return gradePickerValues[row]
}
func pickerView2(_ pickerView2: UIPickerView, titleForRow2 row2: Int, forComponent2 component2: Int) -> String? {
return stopPickerValues[row2]
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
gradeTextField.text = gradePickerValues[row]
self.view.endEditing(true)
}
func pickerView2(_ pickerView2: UIPickerView, didSelectRow2 row2: Int, inComponent2 component2: Int) {
stopTextField.text = stopPickerValues[row2]
self.view.endEditing(true)
}
override func viewDidLoad() {
super.viewDidLoad()
gradePicker = UIPickerView()
stopPicker = UIPickerView()
gradePicker.dataSource = self
stopPicker.dataSource = self
gradePicker.delegate = self
stopPicker.delegate = self
stopTextField.inputView = stopPicker
gradeTextField.inputView = gradePicker
gradeTextField.text = gradePickerValues[0]
stopTextField.text = stopPickerValues[0]
}
}
你可以这样做:
var pickerView: UIPickerView!
...
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int{
if gradeTextField.isFirstResponder {
return gradePickerValues.count
} else {
return stopPickerValues.count
}
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
if gradeTextField.isFirstResponder {
return gradePickerValues[row]
} else {
return stopPickerValues[row]
}
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
if gradeTextField.isFirstResponder {
gradeTextField.text = gradePickerValues[row]
} else {
stopTextField.text = stopPickerValues[row]
}
self.view.endEditing(true)
}
override func viewDidLoad() {
super.viewDidLoad()
pickerView = UIPickerView()
pickerView.dataSource = self
pickerView.delegate = self
stopTextField.inputView = pickerView
gradeTextField.inputView = pickerView
gradeTextField.text = gradePickerValues[0]
stopTextField.text = stopPickerValues[0]
}
问题是您的 pickerView2
方法被忽略了。我在上面发布的方式检查哪个文本字段是执行所需操作的第一响应者或 return 正确的值。
编辑
正如 rmaddy 所指出的,您只需要一个选择器视图,因为您一次只能将一个文本字段作为第一响应者。
我同意@ajeferson 的回答,但如果您仍想同时使用这两个选择器视图,请试试这个:
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int{
if pickerView == gradePicker{
return gradePickerValues.count
}
else{
return stopPickerValues.count
}
}
delegate和datasource方法都提供了UIPickerView的各个对象,方便我们使用。