3

So far I've only found date-picker bound to UITextField, but I need a date-picker which opens on UIButton tap in the same way as it does with the UITextField.

Is it possible? And if so, how? Thanks in advance.

Bista
  • 7,869
  • 3
  • 27
  • 55
giuse
  • 337
  • 1
  • 2
  • 12
  • 2
    `addSubview:`. Have you tried anything? – Lord Zsolt Mar 20 '15 at 11:39
  • Create a new UIView add datePicker into it and show the view on button click. – Bista Mar 20 '15 at 11:40
  • 2
    Sorry, I won't [do it again](http://stackoverflow.com/a/4824319/457406) for Swift. (Or maybe I should considering that I got 77 upvotes from that) – Matthias Bauch Mar 20 '15 at 11:44
  • @guise: You can use same way for textfield that is create one textfield with height 0 or hidden that while click the button make the textfield as firstResponder this is easiest way to do this.. – TamilKing Mar 20 '15 at 12:48

4 Answers4

8
@IBAction func BtnClicked(sender: AnyObject) {
    var picker : UIDatePicker = UIDatePicker()
    picker.datePickerMode = UIDatePickerMode.Date
    picker.addTarget(self, action: "dueDateChanged:", forControlEvents: UIControlEvents.ValueChanged)
    var pickerSize : CGSize = picker.sizeThatFits(CGSizeZero)
    picker.frame = CGRectMake(0.0, 250, pickerSize.width, 460)
    // you probably don't want to set background color as black
    // picker.backgroundColor = UIColor.blackColor()
    self.view.addSubview(picker)
}

func dueDateChanged(sender:UIDatePicker){
    var dateFormatter = NSDateFormatter()
    dateFormatter.dateStyle = NSDateFormatterStyle.LongStyle
    dateFormatter.timeStyle = NSDateFormatterStyle.NoStyle
    self.myLabel.text = dateFormatter.stringFromDate(dueDatePickerView.date)
}
David
  • 3,285
  • 1
  • 37
  • 54
iAnurag
  • 9,286
  • 3
  • 31
  • 48
8

because i dont have enough reputation to comment , i am posting same answer of @iAnurag in Swift 4

 @IBAction func UpdateDOBClick(_ sender: UIButton) {
    let picker : UIDatePicker = UIDatePicker()
    picker.datePickerMode = UIDatePickerMode.date
    picker.addTarget(self, action: #selector(dueDateChanged(sender:)), for: UIControlEvents.valueChanged)
    let pickerSize : CGSize = picker.sizeThatFits(CGSize.zero)
    picker.frame = CGRect(x:0.0, y:250, width:pickerSize.width, height:460)
    // you probably don't want to set background color as black
    // picker.backgroundColor = UIColor.blackColor()
    self.view.addSubview(picker)
}
@objc func dueDateChanged(sender:UIDatePicker){
    let dateFormatter = DateFormatter()
    dateFormatter.dateStyle = .short
    dateFormatter.timeStyle = .none
dobButton.setTitle(dateFormatter.string(from: sender.date), for: .normal)
}
krishan kumar
  • 378
  • 6
  • 11
  • It is not showing date picker but a label with date mentioned on it and on it's tapping it opens picker. But, I need to open picker directly on button tap – iPhone 7 Jun 22 '21 at 12:31
0

Here is another approach using .hidden feature of the controls. I use a button that changes the title when touched and hides/shows the date picker.

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var showDate: UILabel!
    @IBOutlet weak var myButtonx: UIButton!
    @IBAction func myButton(sender: UIButton) {
        if myButtonx.titleLabel?.text != "Done" {
            // save the date for your need
            showDate.text = "\(myDatePicker.date)"
            myDatePicker.hidden = false
            myButtonx.setTitle("Done",forState: UIControlState.Normal)
        } else {
            myDatePicker.hidden = true
            myButtonx.setTitle("Pick Date",forState: UIControlState.Normal)
        }
    }
    @IBOutlet weak var myDatePicker: UIDatePicker!
    override func viewDidLoad() {
        super.viewDidLoad()
        myDatePicker.hidden = true

        myButtonx.setTitle("Pick Date",forState: UIControlState.Normal)

        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}
JCode
  • 1,788
  • 3
  • 12
  • 29
Syed Tariq
  • 2,878
  • 3
  • 27
  • 37
0
private var datePicker: UIDatePicker?

@IBAction func dateFilterAction(_ sender: UIButton) {
    if self.view.subviews.contains(where: { $0 is UIDatePicker }) {
        self.datePicker?.removeFromSuperview()
        dateFilter.setTitle("Datum", for: .normal)
    } else {
        datePicker = nil
        setupDatePicker()
    }
}

private func setupDatePicker() {
    let picker = datePicker ?? UIDatePicker()
    picker.datePickerMode = .date
    if #available(iOS 13.4, *) {
        picker.preferredDatePickerStyle = .wheels
    }
    picker.addTarget(self, action: #selector(dueDateChanged(sender:)), for: .valueChanged)
    let size = self.view.frame.size
    picker.frame = CGRect(x: 0.0, y: size.height - 200, width: size.width, height: 200)
    picker.backgroundColor = UIColor.white
    self.datePicker = picker
    self.view.addSubview(self.datePicker!)
}

@objc func dueDateChanged(sender:UIDatePicker){
    let dateFormatter = DateFormatter()
    dateFormatter.dateStyle = .short
    dateFormatter.timeStyle = .none
    
    print("action")
    
    dateFilter.setTitle(dateFormatter.string(from: sender.date), for: .normal)
}
siki
  • 33
  • 1
  • 4