【问题标题】:Select first or any row with done button in UIPickerView and UIDatePicker for Swift在 UIPickerView 和 UIDatePicker for Swift 中选择第一行或任何带有完成按钮的行
【发布时间】:2017-08-11 06:10:35
【问题描述】:

我有一个带有 4 个 UITextField 的 ViewController。前 3 个由它们自己的 UIPickerView 填充,第 4 个由 UIDatePicker 填充。

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

以下是适用于第一个 UIPicker 的代码。从Selecting first row in UIPickerView issue 得到它。

func doneButton(sender: AnyObject) {
    let row = pickerView1.selectedRow(inComponent: 0);
    pickerView(pickerView1, didSelectRow: row, inComponent:0)
    view.endEditing(true)
}

如何让完成按钮对所有 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]
    }
}
}

【问题讨论】:

  • 您想在完成按钮操作中为每个UITextFieldUIPickerView 执行单独的代码吗?
  • 我已经尝试了几种变体,但似乎无法弄清楚。

标签: swift uipickerview uidatepicker


【解决方案1】:

使用两个具有不同数组输入的选择器和一个日期选择器检查此代码

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)")

    }

}

按钮操作上的控制台输出

【讨论】:

  • 我更改了代码,但是当我使用完成按钮选择第一个选择器中的第一行时,它也选择了第二个选择器中的第一行。
  • 是的,因为你问过。 “我希望完成按钮能够选择每个选择器的第一行,或者如果不是第一行,则选择选择的任何一行。”我以这种方式编写了代码,您想要在 DoneButton Action 上输出什么?请告诉我,我会满足你的要求
  • 感谢@iOS 极客。您的代码有效,但它同时选择了每个选择器的第一行。我的问题应该更具体一点。我想要的是选择器工具栏的完成按钮仅适用于该选择器。我可能想要第一个选择器中的第一行,然后是第二个选择器中的第三行。我在下面粘贴的代码允许我选择选择器中可见的任何行,而不会影响其他 3 个选择器。这段代码看起来不错还是有更好的写法?
【解决方案2】:

所以我想出了自己问题的答案。我曾尝试按照@user3589771 的建议为每个 UITextFiled 和 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)
}

【讨论】:

    猜你喜欢
    • 2015-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多