UITextField 和 UIDatePicker

UITextField and UIDatePicker

我的 UIDatePicker 有 2 个问题:

代码:

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

@IBAction func tfDateNaissanceEditing(sender: UITextField) {
    let datePickerView:UIDatePicker = UIDatePicker()

    datePickerView.datePickerMode = UIDatePickerMode.Date

    sender.inputView = datePickerView

    datePickerView.addTarget(self, action: Selector("datePickerValueChanged:"), forControlEvents: UIControlEvents.ValueChanged)
    tfDateNaissance.resignFirstResponder()

}

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

    dateFormatter.dateStyle = NSDateFormatterStyle.MediumStyle

    dateFormatter.timeStyle = NSDateFormatterStyle.NoStyle

    tfDateNaissance.text = dateFormatter.stringFromDate(sender.date)
    tfDateNaissance.resignFirstResponder()
}

又是我

对于问题 1,您正在收听的 tfDateNaissanceEditing 函数的事件是什么? 你 tfDateNaissance.resignFirstResponder() 的目的是什么?我想那里发生的事情是你听了 startEditing 事件。所以日期选择器在您第一次触摸它时被设置为输入视图,并立即被最后一行代码调用。

理论上,您只需在 viewDidLoad

中编写如下代码即可实现您想要的效果
...
// your other functions

let datePickerView : UIDatePicker = UIDatePicker()
datePickerView.datePickerMode = UIDatePickerMode.Date
UITextField.inputView = datePickerView

datePickerView.addTarget(self, action: Selector("datePickerValueChanged:"), forControlEvents: UIControlEvents.ValueChanged)

Q2。目前每次 DatePicker 的值改变时,它都会自行辞职,所以删除 datePickerValueChanged 函数中的 tfDateNaissance.resignFirstResponder() 将解决问题。如果你想要一个带有完成按钮的自定义工具栏,你可以手动创建一个并将其设置为输入附件视图,也在 viewDidLoad 中。您也可以通过使用

之类的导航栏来实现此目的

顺便说一句,这个问题不需要 didReceiveMemoryWarning 函数。

首先对uitextfield 使用委托回调方法。在

中显示日期选择器(通常以模态方式完成)
textFieldDidBeginEditing:

在模态视图控制器中添加一个关闭模态视图控制器的完成按钮。还获取在日期选择器中设置的日期值,并通过类似以下内容将它们放入文本视图中:

[self.PresentingViewController(你的函数)];

如果您在 datePickerValueChanged 方法中保留 tfDateNaissance.resignFirstResponder(),选择器将在值更改后立即关闭。您必须添加一个 cancel/done 按钮并将 resignFirstResponder() 放入该函数中。我测试了代码并且它有效。

我个人的做法如下,首先声明datePicker

let datePickerView  : UIDatePicker = UIDatePicker()

然后在 viewDidLoad

override func viewDidLoad() {

  datePickerView.datePickerMode =  UIDatePickerMode.Date
  datePickerView.addTarget(self, action: Selector("datePickerValueChanged:"), forControlEvents: UIControlEvents.ValueChanged)

  self.tfDateNaissance.inputView = self.datePickerView //your text field

  //I add a toolBar to the datePicker

  let pickerToolBar = UIToolbar()
  pickerToolBar.barStyle = UIBarStyle.BlackOpaque //you can change the style
  pickerToolBar.translucent = true
  pickerToolBar.tintColor = UIColor.redColor() // or other colours
  pickerToolBar.sizeToFit()

  let spaceButtonPicker = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil)
  let cancelButtonPicker = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Plain, target: self, action: "cancelDatePicker:")
  pickerToolBar.setItems([cancelButtonPicker, spaceButtonPicker], animated: false)
  pickerToolBar.userInteractionEnabled = true
   tfDateNaissance.inputAccessoryView = pickerToolBar

}



func datePickerValueChanged(sender: UIDatePicker) {

 let dateFormatter = NSDateFormatter()
 dateFormatter.dateStyle = NSDateFormatterStyle.MediumStyle
 dateFormatter.timeStyle = NSDateFormatterStyle.NoStyle
 tfDateNaissance.text = dateFormatter.stringFromDate(sender.date)
 //if you leave resignFirstResponder() here, the picker will close as soon as the value change

}

这个处理完成按钮

func cancelDatePicker(sender: UIBarButtonItem){
  tfDateNaissance.resignFirstResponder()
}

这将是结果