点击日期字段时如何调出日期选择器?

Posted

技术标签:

【中文标题】点击日期字段时如何调出日期选择器?【英文标题】:How to bring up a date picker when a date field is tapped? 【发布时间】:2015-06-23 16:03:21 【问题描述】:

我有一个带有日期文本字段的视图。我希望当前日期默认为“今天”,但如果用户想要输入不同的日期,他可以点击该字段以调出日期选择器(已添加到视图中)。我发现了一个类似的问题和答案,尽管我会去工作。我没有错误,但是当我点击日期字段时,键盘会出现,而不是日期选择器。

@IBOutlet var enterDate: UITextField!

@IBAction func dateTapped(sender: UITextField) 

    //code for what to do when date field is tapped
    var datePickerView  : UIDatePicker = UIDatePicker()
    datePickerView.datePickerMode = UIDatePickerMode.Date
    sender.inputView = datePickerView
    datePickerView.addTarget(self, action: Selector("handleDatePicker:"), forControlEvents: UIControlEvents.ValueChanged)


func handleDatePicker(sender: UIDatePicker) 
    var dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "dd MMM yyyy"
    enterDate.text = dateFormatter.stringFromDate(sender.date)

【问题讨论】:

你点击什么样的对象。是UITextField??您是如何添加此文本字段的? 是的,它是一个名为 enterDate 的 UITextField。我不确定你在问什么“你是如何添加这个文本字段的?”我在视图中添加了一个文本字段,然后创建了名为 enterDate 的出口。这能回答你的问题吗? 这就是在 Swift 4 中对我有用的方法 - ***.com/a/56115141/2006730 【参考方案1】:

创建 UITextField 的 Extension 并添加以下方法。

 extension UITextField 

   func addInputViewDatePicker(target: Any, selector: Selector) 

    let screenWidth = UIScreen.main.bounds.width

    //Add DatePicker as inputView
    let datePicker = UIDatePicker(frame: CGRect(x: 0, y: 0, width: screenWidth, height: 216))
    datePicker.datePickerMode = .date
    self.inputView = datePicker

    //Add Tool Bar as input AccessoryView
    let toolBar = UIToolbar(frame: CGRect(x: 0, y: 0, width: screenWidth, height: 44))
    let flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
    let cancelBarButton = UIBarButtonItem(title: "Cancel", style: .plain, target: self, action: #selector(cancelPressed))
    let doneBarButton = UIBarButtonItem(title: "Done", style: .plain, target: target, action: selector)
    toolBar.setItems([cancelBarButton, flexibleSpace, doneBarButton], animated: false)

    self.inputAccessoryView = toolBar
 

   @objc func cancelPressed() 
     self.resignFirstResponder()
   

在 ViewController 中添加一个 UITextField 并创建 IBOutlet:-

import UIKit

class ViewController: UIViewController 

@IBOutlet weak var DOBTextField: UITextField!

override func viewDidLoad() 
    super.viewDidLoad()

    DOBTextField.addInputViewDatePicker(target: self, selector: #selector(doneButtonPressed))



@objc func doneButtonPressed() 
    if let  datePicker = self.DOBTextField.inputView as? UIDatePicker 
        let dateFormatter = DateFormatter()
        dateFormatter.dateStyle = .medium
        self.DOBTextField.text = dateFormatter.string(from: datePicker.date)
    
    self.DOBTextField.resignFirstResponder()
 

【讨论】:

当我使用此代码然后再次单击文本字段时,日期向前移动到 3 个维度。如何解决这个问题?【参考方案2】:

我猜您正在使用UITextField 作为输入,但您尚未在 datePicker 和文本字段之间建立连接。

看看this answer here

这可以通过textfield.inputView = datePickerView 快速完成。在此之后,点击文本字段将由 datePicker 处理,但您应该在执行此操作之前初始化 datePicker。

【讨论】:

我查看了您链接到的答案。那是快速代码吗?那里有很多我以前从未见过的。另外,我不明白您的评论“将 datePicker 与 textField 挂钩”。这是什么意思? 通过连接文本字段我的意思是设置文本字段和日期选择器之间的连接。很快,它可能类似于txtField.inputView = datePickerView。之后,点击事件应该由 datePicker 处理。但是,您应该像 viewDidLoad 等那样事先初始化 datePicker 感谢您的澄清。我已经使用代码 enterDate.inputView = datePickerView 连接了文本字段和日期选择器。仍然当我运行代码时,我得到的是键盘而不是日期选择器。当您说初始化 datePicker 时,您的意思是在 viewDidLoad 方法中运行该代码吗?我是从我所写的内容中删除该行并将其放入 viewDidLoad 方法中,还是将所有代码移到那里?恐怕我在这里需要一只小手。 当视图加载时,默认的 inputView 将被分配给您的 txtField,因此您需要在 viewDidLoad() 上将新的 datePicker 分配给您的 txtField.inputView。【参考方案3】:

我认为您不需要dateTapped 操作。如果您将所有设置代码放在初始化文本字段的位置,我认为它会自动工作。

我认为您看到的问题是由于您仅在按下文本字段之后设置了inputView。如果您之前设置它(例如enterDate.inputView = datePickerView),系统应该处理其余的。换句话说,当该文本字段成为第一响应者时,它将显示 inputView 而不是常规键盘。

【讨论】:

我修改了你写的代码,但我得到了相同的行为。当我点击该字段时,键盘会出现。

以上是关于点击日期字段时如何调出日期选择器?的主要内容,如果未能解决你的问题,请参考以下文章

在文本字段点击上显示日期选择器

使 eternicode 日期选择器在点击时打开,而不是焦点

如何将颤动的日期选择器值添加到文本字段?

如何在第一次单击日期文本字段时生成我的日期选择器 UI?

如何以酥脆的形式在日期字段上显示日期选择器日历?

如何在日期选择器角度禁用过去的日期