【问题标题】:UIDatePicker not showing up in UITextField. Swift 3UIDatePicker 未显示在 UITextField 中。斯威夫特 3
【发布时间】:2017-12-08 14:29:58
【问题描述】:

我在 1 个视图控制器中有 5 个 UITextField。前 4 个显示一个弹出 UIPickerView,其中填充了来自相应数组的数据。当我旋转选择器时,该部分将显示在文本字段中。

第 5 个 UITextField 显示一个弹出式 UIDatepicker,但日期和时间从不显示在文本字段中。

我看了无数的教程,在这个论坛上搜索了几天,仍然无法正常工作。

我做错了什么?任何帮助将不胜感激。

这是我的代码:

import UIKit

class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate {

    var pickerView1 = UIPickerView()
    var pickerView2 = UIPickerView()
    var pickerView3 = UIPickerView()
    var pickerView4 = UIPickerView()
    var pickerView5 = UIDatePicker()

    @IBOutlet var mountainTextField: UITextField!
    @IBOutlet var difficultyTextField: UITextField!
    @IBOutlet var runTextField: UITextField!
    @IBOutlet var whenTextField: UITextField!
    @IBOutlet var snowTextField: UITextField!
    @IBAction func whenTextField(_ sender: UITextField) {        
        let datePickerView:UIDatePicker = UIDatePicker()
        datePickerView.datePickerMode = UIDatePickerMode.dateAndTime
        sender.inputView = datePickerView
        datePickerView.addTarget(self, action: #selector(ViewController.datePickerValueChanged), for: UIControlEvents.valueChanged)
    }

    var mountain = ["A", "B"]
    var difficulty = ["1", "2", "3", "4"]
    var run = ["5", "6", "7", "8"]
    var snow = ["C", "D", "E", "F"]

    override func viewDidLoad() {
        super.viewDidLoad()
        pickerView1 = UIPickerView()
        pickerView2 = UIPickerView()
        pickerView3 = UIPickerView()
        pickerView4 = UIPickerView()
        pickerView5 = UIDatePicker()
        pickerView1.delegate = self
        pickerView2.delegate = self
        pickerView3.delegate = self
        pickerView4.delegate = self

        pickerView1.tag = 0
        pickerView2.tag = 1
        pickerView3.tag = 2
        pickerView4.tag = 3
        pickerView5.tag = 4

        self.mountainTextField.inputView = self.pickerView1;
        self.difficultyTextField.inputView = self.pickerView2;
        self.runTextField.inputView = self.pickerView3;
        self.snowTextField.inputView = self.pickerView4;
        self.whenTextField.inputView = self.pickerView5;
    }

    func datePickerValueChanged(sender:UIDatePicker) {
        let dateFormatter = DateFormatter()

        whenTextField.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 mountain.count
        } else if pickerView.tag == 1 {
            return difficulty.count
        } else if pickerView.tag == 2 {
            return  run.count
        } else if  pickerView.tag == 3 {
            return snow.count
        }

        return 1
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        if pickerView.tag == 0 {
            return mountain[row]
        } else if pickerView.tag == 1 {
            return difficulty[row]
        } else if pickerView.tag == 2 {
            return run[row]
        } else if pickerView.tag == 3 {
            return snow[row]
        }

        return ""
    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)  {
        if pickerView.tag == 0 {
            mountainTextField.text = mountain[row]
        } else if pickerView.tag == 1 {
            difficultyTextField.text = difficulty[row]
        } else if pickerView.tag == 2 {
            runTextField.text = run[row]
        } else if pickerView.tag == 3 {
            snowTextField.text = snow[row]
        }
    }
}

【问题讨论】:

  • whenTextField 什么时候打电话?

标签: ios swift swift3 uitextfield uidatepicker


【解决方案1】:

UIDatePicker 不需要在swift 3 中添加委托 只需检查代码

class ViewController: UIViewController {
//Text Field Connection
@IBOutlet weak var txtDatePicker: UITextField!
//Uidate picker
let datePicker = UIDatePicker()

override func viewDidLoad() {
    super.viewDidLoad()
    //show date picker
    showDatePicker()
}


func showDatePicker(){
    //Formate Date
    datePicker.datePickerMode = .date

    //ToolBar
    let toolbar = UIToolbar();
    toolbar.sizeToFit()

    //done button & cancel button
    let doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.bordered, target: self, action: "donedatePicker")
    let spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil)
    let cancelButton = UIBarButtonItem(title: "Cancel", style: UIBarButtonItemStyle.bordered, target: self, action: "cancelDatePicker")
    toolbar.setItems([doneButton,spaceButton,cancelButton], animated: false)

    // add toolbar to textField
    txtDatePicker.inputAccessoryView = toolbar
    // add datepicker to textField
    txtDatePicker.inputView = datePicker

}

func donedatePicker(){
    //For date formate
    let formatter = DateFormatter()
    formatter.dateFormat = "dd/MM/yyyy"
    txtDatePicker.text = formatter.string(from: datePicker.date)
    //dismiss date picker dialog
    self.view.endEditing(true)
}

  func cancelDatePicker(){
    //cancel button dismiss datepicker dialog
    self.view.endEditing(true)
  }
}

查看完整源码到 github 链接:https://github.com/enamul95/DatePicker1

【讨论】:

    【解决方案2】:

    在您的viewDidload 中添加以下行,

       pickerView5.addTarget(self, action: #selector(ViewController.datePickerValueChanged), for: UIControlEvents.valueChanged)
    

    并将您的datePickerValueChanged 替换为以下内容,

     func datePickerValueChanged(sender:UIDatePicker) {
    
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyy-MM-dd"   // or whatever date format you want
        whenTextField.text = dateFormatter.string(from: sender.date)
    }
    

    就是这样!

    【讨论】:

      【解决方案3】:

      乍一看好像你没有为pickerView5设置代理?

      【讨论】:

      • 我已尝试添加行 pickerView5.delegate = self 但我收到一条错误消息 Value of type 'UIDatePicker' has no member 'delegate'
      • 当你在whenTextField.text = dateFormatter.string(from: sender.date) 行添加断点时,sender.date 是什么样子的?
      • 在响应用户交互 (developer.apple.com/documentation/uikit/uidatepicker) 下好好阅读这里
      【解决方案4】:

      我相信您必须在将日期转换为字符串时为 DateFormatter 提供 dateFormat。 尝试使用

      func datePickerValueChanged(sender:UIDatePicker) {
      
          let dateFormatter = DateFormatter()
          dateFormatter.dateFormat = "MM/dd/yyyy"
          whenTextField.text = dateFormatter.string(from: sender.date)
      }
      

      【讨论】:

      • 函数 datePickerValueChanged 是否被调用??
      【解决方案5】:

      https://github.com/yudiz-solutions/PickerDemo 请试试这个库,它提供了所有的选择器并且易于实现回调

      【讨论】:

        【解决方案6】:

        您的代码有两个更改,如下所示..

        1.

        pickerView5.addTarget(self, action: #selector(datePickerValueChanged(sender:)), for: .valueChanged)
        

        2.

        func datePickerValueChanged(sender:UIDatePicker) {
            let dateFormatter = DateFormatter()
            dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
            whenTextField.text = dateFormatter.string(from: sender.date)
        }
        

        完整的运行代码

        import UIKit
        
        class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate{
        
            var pickerView1 = UIPickerView()
            var pickerView2 = UIPickerView()
            var pickerView3 = UIPickerView()
            var pickerView4 = UIPickerView()
            var pickerView5 = UIDatePicker()
        
        
            @IBOutlet var mountainTextField: UITextField!
            @IBOutlet var difficultyTextField: UITextField!
            @IBOutlet var runTextField: UITextField!
            @IBOutlet var whenTextField: UITextField!
            @IBOutlet var snowTextField: UITextField!
        
        //    @IBAction func whenTextField(_ sender: UITextField) {
        //        
        //        let datePickerView:UIDatePicker = UIDatePicker()
        //        datePickerView.datePickerMode = UIDatePickerMode.dateAndTime
        //        sender.inputView = datePickerView
        //        datePickerView.addTarget(self, action: #selector(ViewController.datePickerValueChanged), for: UIControlEvents.valueChanged)
        //    }
        
        
        
            var mountain = ["A", "B"]
            var difficulty = ["1", "2", "3", "4"]
            var run = ["5", "6", "7", "8"]
            var snow = ["C", "D", "E", "F"]
        
        
            override func viewDidLoad() {
                super.viewDidLoad()
                pickerView1 = UIPickerView()
                pickerView2 = UIPickerView()
                pickerView3 = UIPickerView()
                pickerView4 = UIPickerView()
                pickerView5 = UIDatePicker()
        
                pickerView1.delegate = self
                pickerView2.delegate = self
                pickerView3.delegate = self
                pickerView4.delegate = self
        
                pickerView1.tag = 0
                pickerView2.tag = 1
                pickerView3.tag = 2
                pickerView4.tag = 3
                pickerView5.tag = 4
        
                self.mountainTextField.inputView = self.pickerView1;
                self.difficultyTextField.inputView = self.pickerView2;
                self.runTextField.inputView = self.pickerView3;
                self.snowTextField.inputView = self.pickerView4;
                self.whenTextField.inputView = self.pickerView5;
        
                pickerView5.addTarget(self, action: #selector(datePickerValueChanged(sender:)), for: .valueChanged)
            }
        
        
        
            func datePickerValueChanged(sender:UIDatePicker) {
                let dateFormatter = DateFormatter()
                dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
                whenTextField.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 mountain.count
                } else if pickerView.tag == 1 {
                    return difficulty.count
                } else if pickerView.tag == 2 {
                    return  run.count
                } else if  pickerView.tag == 3 {
                    return snow.count
                }
                return 1
            }
        
            func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        
                if pickerView.tag == 0 {
                    return mountain[row]
                } else if pickerView.tag == 1 {
                    return difficulty[row]
                } else if pickerView.tag == 2 {
                    return run[row]
                } else if pickerView.tag == 3 {
                    return snow[row]
                }
        
                return ""
            }
        
            func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)  {
        
                if pickerView.tag == 0 {
                    mountainTextField.text = mountain[row]
                } else if pickerView.tag == 1 {
                    difficultyTextField.text = difficulty[row]
                } else if pickerView.tag == 2 {
                    runTextField.text = run[row]
                } else if pickerView.tag == 3 {
                    snowTextField.text = snow[row]
                }
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2017-03-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-02-15
          • 1970-01-01
          • 1970-01-01
          • 2017-07-22
          • 2017-11-14
          相关资源
          最近更新 更多