【问题标题】:UITextField and UIDatePickerUITextField 和 UIDatePicker
【发布时间】:2015-12-23 09:00:56
【问题描述】:

我的UIDatePicker 有两个问题:

  • 我必须在我的UITextField 上点按两次才能显示UIDatePicker

  • 当我连续选择某项时,例如,UIDatePicker 即将关闭的那一天,我认为最好阻止它并设置一个“完成”按钮

    李>

代码:

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

【问题讨论】:

  • resignFirstResponder() 是关闭键盘的方法(在本例中为日期选择器)。您必须手动添加“完成”按钮,例如查看此链接:stackoverflow.com/questions/20192303/…
  • @aramusss 谢谢,您的链接使用的是 Objective-C 语言
  • @Ben,这是真的。虽然你选择使用 Swift,但是对于 iOS 开发者来说,理解 Obj-C 代码很重要。
  • @Ben 如果您将tfDateNaissance.resignFirstResponder() 留在您的datePickerValueChanged method 中,则选择器将在值更改后立即关闭。我个人使用完成按钮向选择器添加了一个工具栏来处理resignFirstResponder。检查答案。希望对您有所帮助。

标签: ios iphone swift uitextfield uidatepicker


【解决方案1】:

如果您在datePickerValueChanged 方法中保留tfDateNaissance.resignFirstResponder(),则选择器将在值更改后立即关闭。您必须添加一个取消/完成按钮并将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()
}

这就是结果

【讨论】:

    【解决方案2】:

    又是我。

    对于 Q1,您正在收听的 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)
    

    第二季度。目前每次DatePicker的值发生变化时都会自动退出,所以在datePickerValueChanged函数中去掉tfDateNaissance.resignFirstResponder()就可以解决问题。如果您想拥有一个带有完成按钮的自定义工具栏,您可以手动创建一个并将其设置为输入附件视图,也在viewDidLoad 中。您也可以使用this answer之类的导航栏来实现这一点

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

    【讨论】:

    • 也忘记那一行:dateFormatter.dateFormat = "dd-MMM-yyyy" 不起作用
    • @Ben,UIDatePicker 的日期格式取决于区域设置。所以如果你想要一些自定义格式,你需要实现你自己的UIPickerView
    • 不,没关系,因为dateFormatter.dateStyle = NSDateFormatterStyle.MediumStyle dateFormatter.timeStyle = NSDateFormatterStyle.NoStyle
    【解决方案3】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-19
      • 2011-06-11
      相关资源
      最近更新 更多