【问题标题】:UIPickerView is not selecting the date in UITextFieldUIPickerView 没有在 UITextField 中选择日期
【发布时间】:2018-03-20 09:46:00
【问题描述】:

我是 swift 的新手。在执行此应用程序登录屏幕进入登录。在选择“已经有帐户注册”。您可以注册视图。在注册时尝试开发选择器视图。这是开发选择器视图时出现的两个问题

1) 选择器视图应在加载视图控制器时隐藏。但选择器视图在视图控制器出现时可见?

2)在出生日期,选择日期选择器视图上的DON DONE按钮时,APP崩溃。但它应该在文本字段中显示相应的日期?

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

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


        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)

        dateTextField.inputAccessoryView = toolbar
        dateTextField.inputView = datePicker

    }
    func donedatePicker(){

        let formatter = DateFormatter()
        formatter.dateFormat = "dd/MM/yyyy"
        dateTextField.text = formatter.string(from: datePicker.date)
        self.view.endEditing(true)
    }

    func cancelDatePicker(){
        self.view.endEditing(true)
    }
  override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    pickerView.delegate=self
    pickerView.dataSource=self
    genderTextField.inputView=pickerView

    showDatePicker()

}

如何避免这种崩溃。你可以从这个链接下载项目https://drive.google.com/file/d/1a6Pmw2gVDwLP9grL8tG72NBx-tKwZozI/view?usp=sharing

【问题讨论】:

  • 你在哪里调用了 showDatePicker() 方法?
  • 我已经编辑了问题。在视图中确实加载了
  • 你想什么时候显示选择器视图?
  • 显示性别男性女性
  • 你想在 UITextField 上点击显示日期选择器吗?

标签: swift datepicker uipickerview


【解决方案1】:

你在视图中错过了一些东西我已经更新了代码

override func viewDidLoad() {
        super.viewDidLoad()
        pickerView.delegate=self
        pickerView.dataSource=self
        genderTextField.inputView = pickerView
        genderTextField.delegate = self
        dateTextField.delegate = self

    }

分配文本字段委托并实现函数 textFieldShouldBeginEditing 用于显示日期选择器

func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
        if textField.tag == 1 { //Date Text Field
            showDatePicker()
        }
        return true
    }

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }

我已经从情节提要中分配了日期文本字段的标记值,并从情节提要中隐藏了选取器视图。它会解决你的两点

【讨论】:

  • genderTextField.delegate = self //不能将'ViewController'类型的值赋值给'UITextFieldDelegate'类型dateTextField.delegate = self 。 //Cannot assign value of type 'ViewController' to type 'UITextFieldDelegate?'............viewDidLoad 的最后两行给出了以下错误
  • 类 ViewController: UIViewController,UIPickerViewDelegate,UIPickerViewDataSource, UITextFieldDelegate {
  • 包括 UITextFieldDelegate
  • 如何在视图控制器加载时使选取器视图消失
  • 暂时从情节提要中隐藏它们
【解决方案2】:

首先你需要将委托给 UITextField 即

dateTextField.delegate = self

然后您需要使用注册类的 UITextFieldDelegate 方法进行确认,即

func textFieldDidBeginEditing(_ textField: UITextField) {
       if textField ==  dateTextField {
          self.showDatePicker()
       }

}

使用上面的代码可能会对你有所帮助。

【讨论】:

    【解决方案3】:
    override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view, typically from a nib.
            pickerView.delegate=self
            pickerView.dataSource=self
            genderTextField.inputView=pickerView
    
            showDatePicker()
    
        }
    

    错误就在这里。当视图在viewDidLoad 中加载时,日期选择器会自行显示。所以你必须添加一个点击动作来显示你的选择器视图并在那里调用它。

    例如

    @objc fileprivate func showIt(_ sender:UIButton){
       showDatePicker()
    }
    

    您的操作也必须设置为 #selector

    let doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.bordered, target: self, action: "donedatePicker") 
    

    改为

    let doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.bordered, target: self, action: #selector(donedatePicker))
    

    对于错误 #1,您必须以某种方式使 firstResponder UITextField 退出,您必须辞职。

    你能为textFieldDelegate添加这个功能吗?

    extension YourViewController: UITextFieldDelegate{
           func textFieldDidBeginEditing(_ textField: UITextField) {
                if textField.isFirstResponder{
                    showDatePicker()
                }
            }
    }
    

    【讨论】:

    • 如何让firstResponder UITextField 辞职呢?
    • myTextField.resignFirstResponder()
    • genderTextField.resignFirstResponder() dateTextField.resignFirstResponder() ...我已将这些语句放在视图中确实加载但错误 #1 仍然存在..
    • 再次编辑答案
    【解决方案4】:

    您应该在日期文本字段中点击showDatePicker()

    func textFieldDidBeginEditing(_ textField: UITextField) {
        let datePicker = UIDatePicker()
    
        if startDateTxt == textField{
            textField.inputView = datePicker
            datePicker.addTarget(self, action: #selector(showDatePicker()), for: .valueChanged)
        }
     }
    

    对于第二个错误:

    let doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.bordered, target: self, action: #selector(donedatePicker))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多