点击日期字段时如何调出日期选择器?
How to bring up a date picker when a date field is tapped?
我有一个带有日期文本字段的视图。我希望当前日期默认为 "today" 但如果用户想要输入不同的日期,他可以点击该字段以调出日期选择器(已添加到视图中)。我发现了一个类似的问题和答案,我虽然会工作。我没有错误,但是当我点击日期字段时,会出现键盘,而不是日期选择器。
@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)
}
我认为您不需要 dateTapped
操作。如果您将所有设置代码放在初始化文本字段的地方,我认为它会自动运行。
我认为您遇到的问题是由于您仅在 按下文本字段后设置了 inputView
。如果您之前设置它(例如 enterDate.inputView = datePickerView
),系统应该会处理其余部分。换句话说,当该文本字段成为第一响应者时,它将显示 inputView
而不是常规键盘。
我猜你正在使用 UITextField
作为输入,但你还没有在 datePicker 和文本字段之间建立连接。
看看this answer here
在 swift 中,这可以通过 textfield.inputView = datePickerView
完成。在此之后,对文本字段的点击将由 datePicker 处理,但您应该在执行此操作之前初始化 datePicker。
创建 UITextField 的扩展并添加以下方法。
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()
}
}
我有一个带有日期文本字段的视图。我希望当前日期默认为 "today" 但如果用户想要输入不同的日期,他可以点击该字段以调出日期选择器(已添加到视图中)。我发现了一个类似的问题和答案,我虽然会工作。我没有错误,但是当我点击日期字段时,会出现键盘,而不是日期选择器。
@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)
}
我认为您不需要 dateTapped
操作。如果您将所有设置代码放在初始化文本字段的地方,我认为它会自动运行。
我认为您遇到的问题是由于您仅在 按下文本字段后设置了 inputView
。如果您之前设置它(例如 enterDate.inputView = datePickerView
),系统应该会处理其余部分。换句话说,当该文本字段成为第一响应者时,它将显示 inputView
而不是常规键盘。
我猜你正在使用 UITextField
作为输入,但你还没有在 datePicker 和文本字段之间建立连接。
看看this answer here
在 swift 中,这可以通过 textfield.inputView = datePickerView
完成。在此之后,对文本字段的点击将由 datePicker 处理,但您应该在执行此操作之前初始化 datePicker。
创建 UITextField 的扩展并添加以下方法。
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()
}
}