UIPickerView 未在 UITextField 中选择日期

UIPickerView is not selecting the date in UITextField

我是 swift 的新人。在执行此应用程序时,登录屏幕转到签名 in.On,选择 "Already have account sign up"。您可以注册视图。在尝试开发选择器 view.These 的注册中,开发选择器视图时出现了两个问题

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

2)在选择日期选择器视图上完成的按钮时,请选择应用程序崩溃。但是它应该在文本字段中显示相应的日期?

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

}

如何避免此崩溃。您可以从这里下载项目 link https://drive.google.com/file/d/1a6Pmw2gVDwLP9grL8tG72NBx-tKwZozI/view?usp=sharing

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()
            }
        }
}

你错过了一些东西,我已经更新了代码

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
    }

我已经从情节提要中分配了日期文本字段的标签值,并从情节提要中隐藏了选择器视图。它将解决你的两个问题

首先你需要给 UITextField 委托,即

dateTextField.delegate = 自己

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

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

}

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

您应该在点击日期文本字段时调用此 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))