在UIPickerView和UIDatePicker for Swift中选择第一行或任意一行的“完成”按钮
我有一个带有4个UITextFields的ViewController。前3个由自己的UIPickerViews填充,第4个由UIDatePicker填充 我希望一个“完成”按钮能够选择每个选择器的第一行,或者如果不是第一行,则选择选择哪一行 下面是第一个UIPicker的代码。我从你那儿得到的 如何使“完成”按钮对所有4个选择器独立工作 这是完整的代码 非常感谢您的帮助在UIPickerView和UIDatePicker for Swift中选择第一行或任意一行的“完成”按钮,swift,uipickerview,uidatepicker,Swift,Uipickerview,Uidatepicker,我有一个带有4个UITextFields的ViewController。前3个由自己的UIPickerViews填充,第4个由UIDatePicker填充 我希望一个“完成”按钮能够选择每个选择器的第一行,或者如果不是第一行,则选择选择哪一行 下面是第一个UIPicker的代码。我从你那儿得到的 如何使“完成”按钮对所有4个选择器独立工作 这是完整的代码 非常感谢您的帮助 var selectedItemsArray = [String]() class RunInputViewControl
var selectedItemsArray = [String]()
class RunInputViewController: UIViewController, UITextFieldDelegate, UIPickerViewDataSource, UIPickerViewDelegate{
var pickerView1 = UIPickerView()
var pickerView2 = UIPickerView()
var pickerView3 = UIPickerView()
var pickerView4 = UIDatePicker()
@IBOutlet weak var runTypeTextField: UITextField!
@IBOutlet var runTextField: UITextField!
@IBOutlet var snowTypeTextField: UITextField!
@IBOutlet var dateTextField: UITextField!
@IBAction func saveRun(_ sender: Any){
if (runTypeTextField.text != ""){
runFeedList.append(runTypeTextField.text!)
runTypeTextField.text = ""
}
}
override func viewDidLoad() {
super.viewDidLoad()
createToolbar()
pickerView1 = UIPickerView()
pickerView2 = UIPickerView()
pickerView3 = UIPickerView()
pickerView4 = UIDatePicker()
pickerView1.delegate = self
pickerView1.dataSource = self
pickerView2.delegate = self
pickerView2.dataSource = self
pickerView3.delegate = self
pickerView3.dataSource = self
pickerView1.tag = 0
pickerView2.tag = 1
pickerView3.tag = 2
pickerView4.tag = 3
self.runTypeTextField.inputView = self.pickerView1;
self.runTextField.inputView = self.pickerView2;
self.snowTypeTextField.inputView = self.pickerView3;
self.dateTextField.inputView = self.pickerView4;
pickerView4.addTarget(self, action: #selector(datePickerValueChanged(sender:)), for: .valueChanged)
pickerView4.datePickerMode = UIDatePickerMode.time
//let currentDate = NSDate()
//pickerView4.minimumDate = currentDate as Date
//pickerView4.date = currentDate as Date
pickerView4.timeZone = NSTimeZone.local
pickerView4.minuteInterval = 5
}
func createToolbar() {
let toolBar = UIToolbar()
toolBar.sizeToFit()
//Customizations
toolBar.barTintColor = .black
toolBar.tintColor = .white
let doneButton = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(RunInputViewController.doneButton(sender:)))
toolBar.setItems([doneButton], animated: false)
toolBar.isUserInteractionEnabled = true
runTypeTextField.inputAccessoryView = toolBar
runTextField.inputAccessoryView = toolBar
snowTypeTextField.inputAccessoryView = toolBar
dateTextField.inputAccessoryView = toolBar
}
func doneButton(sender: AnyObject) {
let row = pickerView1.selectedRow(inComponent: 0);
pickerView(pickerView1, didSelectRow: row, inComponent:0)
view.endEditing(true)
}
func dismissKeyboard() {
view.endEditing(true)
}
func datePickerValueChanged(sender:UIDatePicker) {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "HH:mm"
pickerView4.datePickerMode = UIDatePickerMode.time
dateTextField.text = dateFormatter.string(from: sender.date)
}
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
if pickerView.tag == 0 {
return runType.count
} else if pickerView.tag == 1 {
return selectedItemsArray.count
} else if pickerView.tag == 2 {
return snowType.count
}
return 1
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
if pickerView.tag == 0 {
return runType[row]
} else if pickerView.tag == 1 {
return selectedItemsArray[row]
} else if pickerView.tag == 2 {
return snowType[row]
}
return ""
}
var selectedRow: Int = 0
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
selectedRow = row
if pickerView == pickerView1 {
runTypeTextField.text = runType[row]
switch row {
case 0:
selectedItemsArray = RunGreen
case 1:
selectedItemsArray = RunBlue
case 2:
selectedItemsArray = RunBlack
case 3:
selectedItemsArray = RunDoubleBlack
default:
selectedItemsArray = []
}
pickerView2.reloadAllComponents()
} else if pickerView == pickerView2 {
let item = selectedItemsArray[row]
if selectedItemsArray == rRunGreen {
runTextField.text = item
} else if selectedItemsArray == RunBlue {
runTextField.text = item
} else if selectedItemsArray == rRunBlack {
runTextField.text = item
} else if selectedItemsArray == RunDoubleBlack {
runTextField.text = item
}
}
if pickerView.tag == 2 {
snowTypeTextField.text = snowType[row]
}
}
}
使用两个具有不同数组输入的选择器和一个日期选择器检查此代码
import UIKit
class PickerViewController: UIViewController,UIPickerViewDataSource, UIPickerViewDelegate {
@IBOutlet weak var pickerVieww: UIPickerView!
@IBOutlet weak var DateePicker: UIDatePicker!
@IBOutlet weak var newPickr: UIPickerView!
var viewControllerArray = [String]()
var viewControllerArray1 = [String]()
var value = Int()
var value1 = Int()
override func viewDidLoad() {
super.viewDidLoad()
pickerVieww.delegate = self
pickerVieww.dataSource = self
newPickr.delegate = self
newPickr.dataSource = self
pickerVieww.tag = 1
newPickr.tag = 2
viewControllerArray = ["controller1","controller2","controller3"]
viewControllerArray1 = ["controller4","controller5","controller6","controller7"]
}
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
if pickerView == pickerVieww
{
return viewControllerArray.count
}
else if pickerView == newPickr
{
return viewControllerArray1.count
}
return 0
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
if pickerView == pickerVieww
{
return viewControllerArray[row]
}
else if pickerView == newPickr
{
return viewControllerArray1[row]
}
return ""
}
func pickerView(_ pickerView: UIPickerView,didSelectRow row: Int,inComponent component: Int)
{
}
@IBAction func DoneButton(_ sender: Any) {
let row = pickerVieww.selectedRow(inComponent: 0);
print("pickervieww value: \(row)")
let row1 = newPickr.selectedRow(inComponent: 0);
print("newpicker value: \(row1)")
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd MMM yyyy"
let date:String = dateFormatter.string(from: DateePicker.date)
print("date: \(date)")
}
}
按钮操作上的控制台输出
使用两个具有不同数组输入的选择器和一个日期选择器检查此代码
import UIKit
class PickerViewController: UIViewController,UIPickerViewDataSource, UIPickerViewDelegate {
@IBOutlet weak var pickerVieww: UIPickerView!
@IBOutlet weak var DateePicker: UIDatePicker!
@IBOutlet weak var newPickr: UIPickerView!
var viewControllerArray = [String]()
var viewControllerArray1 = [String]()
var value = Int()
var value1 = Int()
override func viewDidLoad() {
super.viewDidLoad()
pickerVieww.delegate = self
pickerVieww.dataSource = self
newPickr.delegate = self
newPickr.dataSource = self
pickerVieww.tag = 1
newPickr.tag = 2
viewControllerArray = ["controller1","controller2","controller3"]
viewControllerArray1 = ["controller4","controller5","controller6","controller7"]
}
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
if pickerView == pickerVieww
{
return viewControllerArray.count
}
else if pickerView == newPickr
{
return viewControllerArray1.count
}
return 0
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
if pickerView == pickerVieww
{
return viewControllerArray[row]
}
else if pickerView == newPickr
{
return viewControllerArray1[row]
}
return ""
}
func pickerView(_ pickerView: UIPickerView,didSelectRow row: Int,inComponent component: Int)
{
}
@IBAction func DoneButton(_ sender: Any) {
let row = pickerVieww.selectedRow(inComponent: 0);
print("pickervieww value: \(row)")
let row1 = newPickr.selectedRow(inComponent: 0);
print("newpicker value: \(row1)")
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd MMM yyyy"
let date:String = dateFormatter.string(from: DateePicker.date)
print("date: \(date)")
}
}
按钮操作上的控制台输出
所以我找到了我自己问题的答案。我曾试图按照@user3589771的建议为每个uitextfield和UIPickerView创建单独的代码,但我遗漏了一些东西 我的原始代码
runTypeTextField.inputAccessoryView = toolBar
runTextField.inputAccessoryView = toolBar
snowTypeTextField.inputAccessoryView = toolBar
dateTextField.inputAccessoryView = toolBar
但一旦我分离了每个UITextField的.inputAccessoryView,所有这些都集中在一起了
我终于把它整理好了,答案如下
func createToolbar() {
// Tool bar for 1st UIPickerView
let toolBar1 = UIToolbar()
toolBar1.sizeToFit()
toolBar1.barTintColor = .black
toolBar1.tintColor = .white
let doneButton1 = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(RunInputViewController.doneButton1(sender:)))
toolBar1.setItems([doneButton1], animated: false)
toolBar1.isUserInteractionEnabled = true
runTypeTextField.inputAccessoryView = toolBar1
// Tool bar for 2nd UIPickerView
let toolBar2 = UIToolbar()
toolBar2.sizeToFit()
toolBar2.barTintColor = .black
toolBar2.tintColor = .white
let doneButton2 = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(RunInputViewController.doneButton2(sender:)))
toolBar2.setItems([doneButton2], animated: false)
toolBar2.isUserInteractionEnabled = true
runTextField.inputAccessoryView = toolBar2
// Tool bar for 3rd UIPickerView
let toolBar3 = UIToolbar()
toolBar3.sizeToFit()
toolBar3.barTintColor = .black
toolBar3.tintColor = .white
let doneButton3 = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(RunInputViewController.doneButton3(sender:)))
toolBar3.setItems([doneButton3], animated: false)
toolBar3.isUserInteractionEnabled = true
snowTypeTextField.inputAccessoryView = toolBar3
// Tool bar for UIDatePicker
let toolBar4 = UIToolbar()
toolBar4.sizeToFit()
toolBar4.barTintColor = .black
toolBar4.tintColor = .white
let doneButton4 = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(RunInputViewController.doneButton4))
toolBar4.setItems([doneButton4], animated: false)
toolBar4.isUserInteractionEnabled = true
dateTextField.inputAccessoryView = toolBar4
}
// Done button for 1st UIPickerView
func doneButton1(sender: AnyObject) {
let row1 = pickerView1.selectedRow(inComponent: 0);
pickerView(pickerView1, didSelectRow: row1, inComponent:0)
view.endEditing(true)
}
// Done button for 2nd UIPickerView
func doneButton2(sender: AnyObject) {
let row2 = pickerView2.selectedRow(inComponent: 0);
pickerView(pickerView2, didSelectRow: row2, inComponent:0)
view.endEditing(true)
}
// Done button for 3rd UIPickerView
func doneButton3(sender: AnyObject) {
let row3 = pickerView3.selectedRow(inComponent: 0);
pickerView(pickerView3, didSelectRow: row3, inComponent:0)
view.endEditing(true)
}
// Done button for UIDatePicker
func doneButton4(){
let formatter = DateFormatter()
formatter.dateFormat = "dd/MM/yyyy HH:mm"
dateTextField.text = formatter.string(from: pickerView4.date)
self.view.endEditing(true)
}
所以我找到了我自己问题的答案。我曾试图按照@user3589771的建议为每个uitextfield和UIPickerView创建单独的代码,但我遗漏了一些东西 我的原始代码
runTypeTextField.inputAccessoryView = toolBar
runTextField.inputAccessoryView = toolBar
snowTypeTextField.inputAccessoryView = toolBar
dateTextField.inputAccessoryView = toolBar
但一旦我分离了每个UITextField的.inputAccessoryView,所有这些都集中在一起了
我终于把它整理好了,答案如下
func createToolbar() {
// Tool bar for 1st UIPickerView
let toolBar1 = UIToolbar()
toolBar1.sizeToFit()
toolBar1.barTintColor = .black
toolBar1.tintColor = .white
let doneButton1 = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(RunInputViewController.doneButton1(sender:)))
toolBar1.setItems([doneButton1], animated: false)
toolBar1.isUserInteractionEnabled = true
runTypeTextField.inputAccessoryView = toolBar1
// Tool bar for 2nd UIPickerView
let toolBar2 = UIToolbar()
toolBar2.sizeToFit()
toolBar2.barTintColor = .black
toolBar2.tintColor = .white
let doneButton2 = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(RunInputViewController.doneButton2(sender:)))
toolBar2.setItems([doneButton2], animated: false)
toolBar2.isUserInteractionEnabled = true
runTextField.inputAccessoryView = toolBar2
// Tool bar for 3rd UIPickerView
let toolBar3 = UIToolbar()
toolBar3.sizeToFit()
toolBar3.barTintColor = .black
toolBar3.tintColor = .white
let doneButton3 = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(RunInputViewController.doneButton3(sender:)))
toolBar3.setItems([doneButton3], animated: false)
toolBar3.isUserInteractionEnabled = true
snowTypeTextField.inputAccessoryView = toolBar3
// Tool bar for UIDatePicker
let toolBar4 = UIToolbar()
toolBar4.sizeToFit()
toolBar4.barTintColor = .black
toolBar4.tintColor = .white
let doneButton4 = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(RunInputViewController.doneButton4))
toolBar4.setItems([doneButton4], animated: false)
toolBar4.isUserInteractionEnabled = true
dateTextField.inputAccessoryView = toolBar4
}
// Done button for 1st UIPickerView
func doneButton1(sender: AnyObject) {
let row1 = pickerView1.selectedRow(inComponent: 0);
pickerView(pickerView1, didSelectRow: row1, inComponent:0)
view.endEditing(true)
}
// Done button for 2nd UIPickerView
func doneButton2(sender: AnyObject) {
let row2 = pickerView2.selectedRow(inComponent: 0);
pickerView(pickerView2, didSelectRow: row2, inComponent:0)
view.endEditing(true)
}
// Done button for 3rd UIPickerView
func doneButton3(sender: AnyObject) {
let row3 = pickerView3.selectedRow(inComponent: 0);
pickerView(pickerView3, didSelectRow: row3, inComponent:0)
view.endEditing(true)
}
// Done button for UIDatePicker
func doneButton4(){
let formatter = DateFormatter()
formatter.dateFormat = "dd/MM/yyyy HH:mm"
dateTextField.text = formatter.string(from: pickerView4.date)
self.view.endEditing(true)
}
您想在“完成”按钮操作中为每个UITextField或UIPickerView单独编写代码吗?我尝试了此操作的几种变体,但似乎无法理解。您想在“完成”按钮操作中为每个UITextField或UIPickerView单独编写代码吗?我尝试了此操作的几种变体,但似乎无法理解。我更改了代码,但当我使用“完成”按钮选择第一个选择器中的第一行时,它也选择了第二个选择器中的第一行。是,因为您要求。我希望一个“完成”按钮能够选择每个选择器的第一行,或者如果不是第一行,则选择选择哪一行。我以这种方式编写了代码,您希望DoneButton操作的具体输出是什么?请告诉我我会满足您的要求谢谢@iOS极客。您的代码正常工作,但它同时选择了每个选择器的第一行。我的问题应该更具体一点。我想要的是,选择器工具栏上的“完成”按钮只对该选择器起作用。我可能想要第一个选择器中的第一行,但是第二个选择器中的第三行。下面粘贴的代码允许我选择选择器中可见的任何行,而不会影响其他3个选择器。此代码看起来正常吗?或者有更好的编写方法吗?我更改了代码,但当我使用“完成”按钮选择第一个选择器中的第一行时,它也选择了第二个选择器中的第一行。是,因为您提出了要求。我希望一个“完成”按钮能够选择每个选择器的第一行,或者如果不是第一行,则选择选择哪一行。我以这种方式编写了代码,您希望DoneButton操作的具体输出是什么?请告诉我我会满足您的要求谢谢@iOS极客。您的代码正常工作,但它同时选择了每个选择器的第一行。我的问题应该更具体一点。我想要的是,选择器工具栏上的“完成”按钮只对该选择器起作用。我可能想要第一个选择器中的第一行,但是第二个选择器中的第三行。下面粘贴的代码允许我选择选择器中可见的任何行,而不会影响其他3个选择器。这段代码看起来还好吗,还是有更好的编写方法?