在UIPickerView和UIDatePicker for Swift中选择第一行或任意一行的“完成”按钮

在UIPickerView和UIDatePicker for Swift中选择第一行或任意一行的“完成”按钮,swift,uipickerview,uidatepicker,Swift,Uipickerview,Uidatepicker,我有一个带有4个UITextFields的ViewController。前3个由自己的UIPickerViews填充,第4个由UIDatePicker填充 我希望一个“完成”按钮能够选择每个选择器的第一行,或者如果不是第一行,则选择选择哪一行 下面是第一个UIPicker的代码。我从你那儿得到的 如何使“完成”按钮对所有4个选择器独立工作 这是完整的代码 非常感谢您的帮助 var selectedItemsArray = [String]() class RunInputViewControl

我有一个带有4个UITextFields的ViewController。前3个由自己的UIPickerViews填充,第4个由UIDatePicker填充

我希望一个“完成”按钮能够选择每个选择器的第一行,或者如果不是第一行,则选择选择哪一行

下面是第一个UIPicker的代码。我从你那儿得到的

如何使“完成”按钮对所有4个选择器独立工作

这是完整的代码

非常感谢您的帮助

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个选择器。这段代码看起来还好吗,还是有更好的编写方法?