在 Swift 中的 pop-up datePickerView 中添加完成按钮?
Add a Done button within a pop-up datePickerView in Swift?
我想在 Swift 中弹出的 datePickerView 中添加一个完成按钮。
代码如下:
@IBOutlet var datePicker: UITextField!
@IBAction func dateTextInputPressed(sender: UITextField) {
var datePickerView = 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 = "yyyy-MM-dd"
datePicker.text = dateFormatter.stringFromDate(sender.date)
}
我可以使用这段代码成功弹出一个datePickerView
但是在我选择了日期之后,它没有 "Done" 按钮来关闭它。
那么如何将“完成”按钮添加到其中?
您可以对 UITextField
的 inputView
属性 使用通用 UIView
。我们可以将 UIDatePicker
和 UIButton
添加到此 UIView
.
@IBAction func dateTextInputPressed(sender: UITextField) {
//Create the view
let inputView = UIView(frame: CGRectMake(0, 0, self.view.frame.width, 240))
var datePickerView : UIDatePicker = UIDatePicker(frame: CGRectMake(0, 40, 0, 0))
datePickerView.datePickerMode = UIDatePickerMode.Date
inputView.addSubview(datePickerView) // add date picker to UIView
let doneButton = UIButton(frame: CGRectMake((self.view.frame.size.width/2) - (100/2), 0, 100, 50))
doneButton.setTitle("Done", forState: UIControlState.Normal)
doneButton.setTitle("Done", forState: UIControlState.Highlighted)
doneButton.setTitleColor(UIColor.blackColor(), forState: UIControlState.Normal)
doneButton.setTitleColor(UIColor.grayColor(), forState: UIControlState.Highlighted)
inputView.addSubview(doneButton) // add Button to UIView
doneButton.addTarget(self, action: "doneButton:", forControlEvents: UIControlEvents.TouchUpInside) // set button click event
sender.inputView = inputView
datePickerView.addTarget(self, action: Selector("handleDatePicker:"), forControlEvents: UIControlEvents.ValueChanged)
handleDatePicker(datePickerView) // Set the date on start.
}
func handleDatePicker(sender: UIDatePicker) {
var dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
datePicker.text = dateFormatter.stringFromDate(sender.date)
}
func doneButton(sender:UIButton)
{
datePicker.resignFirstResponder() // To resign the inputView on clicking done.
}
如果您使用的是按钮而不是文本字段:
/**
* MARK - 提前预订行动
*/
@IBAction func advanceBookingAction(sender: UIButton) {
var datePicker : UIDatePicker = UIDatePicker()
var datePickerContainer = UIView()
datePickerContainer.frame = CGRectMake(0.0, self.view.frame.height/2, 320.0, 300.0)
datePickerContainer.backgroundColor = UIColor.whiteColor()
var pickerSize : CGSize = datePicker.sizeThatFits(CGSizeZero)
datePicker.frame = CGRectMake(0.0, 20, pickerSize.width, 460)
datePicker.setDate(NSDate(), animated: true)
datePicker.maximumDate = NSDate()
datePicker.datePickerMode = UIDatePickerMode.DateAndTime
datePicker.addTarget(self, action: "dateChangedInDate:", forControlEvents: UIControlEvents.ValueChanged)
datePickerContainer.addSubview(datePicker)
var doneButton = UIButton()
doneButton.setTitle("Done", forState: UIControlState.Normal)
doneButton.setTitleColor(UIColor.blueColor(), forState: UIControlState.Normal)
doneButton.addTarget(self, action: Selector("dismissPicker:"), forControlEvents: UIControlEvents.TouchUpInside)
doneButton.frame = CGRectMake(250.0, 5.0, 70.0, 37.0)
datePickerContainer.addSubview(doneButton)
self.view.addSubview(datePickerContainer)
}// end advanceBookingAction
/**
* MARK - observer to get the change in date
*/
func dateChangedInDate(sender:UIDatePicker){
var dateFormatter = NSDateFormatter()
dateFormatter.dateStyle = NSDateFormatterStyle.LongStyle
dateFormatter.timeStyle = NSDateFormatterStyle.NoStyle
objMethodInc.printvj("date selected \(datePicker.date)")
}// end dateChangedInDate
/*
* MARK - dismiss the date picker value
*/
func dismissPicker(sender: UIButton) {
objMethodInc.printvj("dismiss date picker")
datePickerContainer.removeFromSuperview()
}// end dismissPicker
我做了这个扩展来关闭选择器。 Swift 2
extension UIToolbar {
func ToolbarPiker(mySelect : Selector) -> UIToolbar {
let toolBar = UIToolbar()
toolBar.barStyle = UIBarStyle.Default
toolBar.translucent = true
toolBar.tintColor = UIColor.blackColor()
toolBar.sizeToFit()
let doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Plain, target: self, action: mySelect)
let spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil)
toolBar.setItems([ spaceButton, doneButton], animated: false)
toolBar.userInteractionEnabled = true
return toolBar
}
}
Swift 3 - 4
extension UIToolbar {
func ToolbarPiker(mySelect : Selector) -> UIToolbar {
let toolBar = UIToolbar()
toolBar.barStyle = UIBarStyle.default
toolBar.isTranslucent = true
toolBar.tintColor = UIColor.black
toolBar.sizeToFit()
let doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.plain, target: self, action: mySelect)
let spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil)
toolBar.setItems([ spaceButton, doneButton], animated: false)
toolBar.isUserInteractionEnabled = true
return toolBar
}
}
而且您可以在 viewController:
中简单地使用它
override func viewDidLoad() {
super.viewDidLoad()
//SWIFT2
/*
let toolBar = UIToolbar().ToolbarPiker(#selector(MyViewController.dismissPicker))
*/
// Swift3 - 4
let toolBar = UIToolbar().ToolbarPiker(mySelect: #selector(MyViewController.dismissPicker))
myTextField.inputAccessoryView = toolBar
}
// Swift 2 - 3
func dismissPicker() {
view.endEditing(true)
}
// Swift 4
@objc func dismissPicker() {
view.endEditing(true)
}
在Swift 5
如果您只想在 DatePicker 上使用 完成 按钮,请使用我的代码
//Write toolbar code for done button
let toolBar = UIToolbar()
toolBar.barStyle = .default
toolBar.isTranslucent = true
let space = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
let doneButton = UIBarButtonItem(title: "Done", style: .done, target: self, action: #selector(onClickDoneButton))
toolBar.setItems([space, doneButton], animated: false)
toolBar.isUserInteractionEnabled = true
toolBar.sizeToFit()
dobTF.inputAccessoryView = toolBar //Change your TextField name here
@objc func onClickDoneButton() {
self.view.endEditing(true)
}
@IBOutlet weak var txtDate: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
//Write toolbar code for done button
let toolBar = UIToolbar()
toolBar.barStyle = .default
toolBar.isTranslucent = true
let space = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
let doneButton = UIBarButtonItem(title: "Done", style: .done, target: self, action: #selector(onClickDoneButton))
toolBar.setItems([space, doneButton], animated: false)
toolBar.isUserInteractionEnabled = true
toolBar.sizeToFit()
txtDate.inputAccessoryView = toolBar //Change your TextField name here
let datePickerView = UIDatePicker()
datePickerView.datePickerMode = UIDatePicker.Mode.date
txtDate.inputView = datePickerView
datePickerView.addTarget(self, action: #selector(handleDatePicker(sender:)), for: UIControl.Event.valueChanged)
}
@objc func onClickDoneButton() {
self.view.endEditing(true)
}
@objc func handleDatePicker(sender: UIDatePicker) {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
txtDate.text = dateFormatter.string(from: sender.date)
}
我想在 Swift 中弹出的 datePickerView 中添加一个完成按钮。
代码如下:
@IBOutlet var datePicker: UITextField!
@IBAction func dateTextInputPressed(sender: UITextField) {
var datePickerView = 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 = "yyyy-MM-dd"
datePicker.text = dateFormatter.stringFromDate(sender.date)
}
我可以使用这段代码成功弹出一个datePickerView
但是在我选择了日期之后,它没有 "Done" 按钮来关闭它。
那么如何将“完成”按钮添加到其中?
您可以对 UITextField
的 inputView
属性 使用通用 UIView
。我们可以将 UIDatePicker
和 UIButton
添加到此 UIView
.
@IBAction func dateTextInputPressed(sender: UITextField) {
//Create the view
let inputView = UIView(frame: CGRectMake(0, 0, self.view.frame.width, 240))
var datePickerView : UIDatePicker = UIDatePicker(frame: CGRectMake(0, 40, 0, 0))
datePickerView.datePickerMode = UIDatePickerMode.Date
inputView.addSubview(datePickerView) // add date picker to UIView
let doneButton = UIButton(frame: CGRectMake((self.view.frame.size.width/2) - (100/2), 0, 100, 50))
doneButton.setTitle("Done", forState: UIControlState.Normal)
doneButton.setTitle("Done", forState: UIControlState.Highlighted)
doneButton.setTitleColor(UIColor.blackColor(), forState: UIControlState.Normal)
doneButton.setTitleColor(UIColor.grayColor(), forState: UIControlState.Highlighted)
inputView.addSubview(doneButton) // add Button to UIView
doneButton.addTarget(self, action: "doneButton:", forControlEvents: UIControlEvents.TouchUpInside) // set button click event
sender.inputView = inputView
datePickerView.addTarget(self, action: Selector("handleDatePicker:"), forControlEvents: UIControlEvents.ValueChanged)
handleDatePicker(datePickerView) // Set the date on start.
}
func handleDatePicker(sender: UIDatePicker) {
var dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
datePicker.text = dateFormatter.stringFromDate(sender.date)
}
func doneButton(sender:UIButton)
{
datePicker.resignFirstResponder() // To resign the inputView on clicking done.
}
如果您使用的是按钮而不是文本字段:
/** * MARK - 提前预订行动 */
@IBAction func advanceBookingAction(sender: UIButton) {
var datePicker : UIDatePicker = UIDatePicker()
var datePickerContainer = UIView()
datePickerContainer.frame = CGRectMake(0.0, self.view.frame.height/2, 320.0, 300.0)
datePickerContainer.backgroundColor = UIColor.whiteColor()
var pickerSize : CGSize = datePicker.sizeThatFits(CGSizeZero)
datePicker.frame = CGRectMake(0.0, 20, pickerSize.width, 460)
datePicker.setDate(NSDate(), animated: true)
datePicker.maximumDate = NSDate()
datePicker.datePickerMode = UIDatePickerMode.DateAndTime
datePicker.addTarget(self, action: "dateChangedInDate:", forControlEvents: UIControlEvents.ValueChanged)
datePickerContainer.addSubview(datePicker)
var doneButton = UIButton()
doneButton.setTitle("Done", forState: UIControlState.Normal)
doneButton.setTitleColor(UIColor.blueColor(), forState: UIControlState.Normal)
doneButton.addTarget(self, action: Selector("dismissPicker:"), forControlEvents: UIControlEvents.TouchUpInside)
doneButton.frame = CGRectMake(250.0, 5.0, 70.0, 37.0)
datePickerContainer.addSubview(doneButton)
self.view.addSubview(datePickerContainer)
}// end advanceBookingAction
/**
* MARK - observer to get the change in date
*/
func dateChangedInDate(sender:UIDatePicker){
var dateFormatter = NSDateFormatter()
dateFormatter.dateStyle = NSDateFormatterStyle.LongStyle
dateFormatter.timeStyle = NSDateFormatterStyle.NoStyle
objMethodInc.printvj("date selected \(datePicker.date)")
}// end dateChangedInDate
/*
* MARK - dismiss the date picker value
*/
func dismissPicker(sender: UIButton) {
objMethodInc.printvj("dismiss date picker")
datePickerContainer.removeFromSuperview()
}// end dismissPicker
我做了这个扩展来关闭选择器。 Swift 2
extension UIToolbar {
func ToolbarPiker(mySelect : Selector) -> UIToolbar {
let toolBar = UIToolbar()
toolBar.barStyle = UIBarStyle.Default
toolBar.translucent = true
toolBar.tintColor = UIColor.blackColor()
toolBar.sizeToFit()
let doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Plain, target: self, action: mySelect)
let spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil)
toolBar.setItems([ spaceButton, doneButton], animated: false)
toolBar.userInteractionEnabled = true
return toolBar
}
}
Swift 3 - 4
extension UIToolbar {
func ToolbarPiker(mySelect : Selector) -> UIToolbar {
let toolBar = UIToolbar()
toolBar.barStyle = UIBarStyle.default
toolBar.isTranslucent = true
toolBar.tintColor = UIColor.black
toolBar.sizeToFit()
let doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.plain, target: self, action: mySelect)
let spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil)
toolBar.setItems([ spaceButton, doneButton], animated: false)
toolBar.isUserInteractionEnabled = true
return toolBar
}
}
而且您可以在 viewController:
中简单地使用它 override func viewDidLoad() {
super.viewDidLoad()
//SWIFT2
/*
let toolBar = UIToolbar().ToolbarPiker(#selector(MyViewController.dismissPicker))
*/
// Swift3 - 4
let toolBar = UIToolbar().ToolbarPiker(mySelect: #selector(MyViewController.dismissPicker))
myTextField.inputAccessoryView = toolBar
}
// Swift 2 - 3
func dismissPicker() {
view.endEditing(true)
}
// Swift 4
@objc func dismissPicker() {
view.endEditing(true)
}
在Swift 5
如果您只想在 DatePicker 上使用 完成 按钮,请使用我的代码
//Write toolbar code for done button
let toolBar = UIToolbar()
toolBar.barStyle = .default
toolBar.isTranslucent = true
let space = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
let doneButton = UIBarButtonItem(title: "Done", style: .done, target: self, action: #selector(onClickDoneButton))
toolBar.setItems([space, doneButton], animated: false)
toolBar.isUserInteractionEnabled = true
toolBar.sizeToFit()
dobTF.inputAccessoryView = toolBar //Change your TextField name here
@objc func onClickDoneButton() {
self.view.endEditing(true)
}
@IBOutlet weak var txtDate: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
//Write toolbar code for done button
let toolBar = UIToolbar()
toolBar.barStyle = .default
toolBar.isTranslucent = true
let space = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
let doneButton = UIBarButtonItem(title: "Done", style: .done, target: self, action: #selector(onClickDoneButton))
toolBar.setItems([space, doneButton], animated: false)
toolBar.isUserInteractionEnabled = true
toolBar.sizeToFit()
txtDate.inputAccessoryView = toolBar //Change your TextField name here
let datePickerView = UIDatePicker()
datePickerView.datePickerMode = UIDatePicker.Mode.date
txtDate.inputView = datePickerView
datePickerView.addTarget(self, action: #selector(handleDatePicker(sender:)), for: UIControl.Event.valueChanged)
}
@objc func onClickDoneButton() {
self.view.endEditing(true)
}
@objc func handleDatePicker(sender: UIDatePicker) {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
txtDate.text = dateFormatter.string(from: sender.date)
}