Swift 3 Displaying a programmatically created datePicker using a UINavBar Button

15,136

I figured out the solution and am posting the code here:

class HVACViewController:  UIViewController, UITableViewDelegate, UITableViewDataSource, UITextFieldDelegate, UNUserNotificationCenterDelegate {

    @IBOutlet weak var HVACTable: UITableView!
    @IBOutlet weak var reminderCell: UITableViewCell!

    let dateFormatter = DateFormatter()
    let locale = NSLocale.current
    var datePicker : UIDatePicker!
    let toolBar = UIToolbar()

    override func viewDidLoad() {
        super.viewDidLoad()


        navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Add", style: .plain, target: self, action: #selector(addTapped))

        self.HVACTable.reloadData()
        //doDatePicker()
    }

    func addTapped(){
        doDatePicker()
    }



    func doDatePicker(){
        // DatePicker
        self.datePicker = UIDatePicker(frame:CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: 200))
        self.datePicker?.backgroundColor = UIColor.white
        self.datePicker?.datePickerMode = UIDatePickerMode.dateAndTime
        datePicker.center = view.center
        view.addSubview(self.datePicker)

        // ToolBar

        toolBar.barStyle = .default
        toolBar.isTranslucent = true
        toolBar.tintColor = UIColor(red: 92/255, green: 216/255, blue: 255/255, alpha: 1)
        toolBar.sizeToFit()

        // Adding Button ToolBar
        let doneButton = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(HVACViewController.doneClick))
        let spaceButton = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
        let cancelButton = UIBarButtonItem(title: "Cancel", style: .plain, target: self, action: #selector(HVACViewController.cancelClick))
        toolBar.setItems([cancelButton, spaceButton, doneButton], animated: true)
        toolBar.isUserInteractionEnabled = true

        self.view.addSubview(toolBar)
        self.toolBar.isHidden = false


    }


    func doneClick() {
        let dateFormatter1 = DateFormatter()
        dateFormatter1.dateStyle = .medium
        dateFormatter1.timeStyle = .none
        setNotification()
        //self.datePicker.resignFirstResponder()
        datePicker.isHidden = true
        self.toolBar.isHidden = true


    }

    func cancelClick() {
        datePicker.isHidden = true
        self.toolBar.isHidden = true

    }
Share:
15,136
soundChaser
Author by

soundChaser

Updated on June 28, 2022

Comments

  • soundChaser
    soundChaser almost 2 years

    I've created a UIPickerView programmatically that I currently call from a UITextField. Instead I would like to call the datePicker when the user presses a button created programmatically on the navigation bar. This is what my datePicker code currently looks like:

    func doDatePicker(){
        // DatePicker
        self.datePicker = UIDatePicker(frame:CGRect(x: 0, y: 0, width:     self.view.frame.size.width, height: 216))
        self.datePicker?.backgroundColor = UIColor.white
        self.datePicker?.datePickerMode = UIDatePickerMode.dateAndTime
        HVACText.inputView = self.datePicker
    
        // ToolBar
        let toolBar = UIToolbar()
        toolBar.barStyle = .default
        toolBar.isTranslucent = true
        toolBar.tintColor = UIColor(red: 92/255, green: 216/255, blue:  255/255, alpha: 1)
        toolBar.sizeToFit()
    
        // Adding Button ToolBar
        let doneButton = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(HVACViewController.doneClick))
        let spaceButton = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
        let cancelButton = UIBarButtonItem(title: "Cancel", style: .plain, target: self, action: #selector(HVACViewController.cancelClick))
        toolBar.setItems([cancelButton, spaceButton, doneButton], animated: false)
        toolBar.isUserInteractionEnabled = true
        HVACText.inputAccessoryView = toolBar
    
    }
    

    I can use the button to call a generic datePicker, but I want to have the Done and Cancel button available to the user. I also want the datePicker to appear at the bottom of the UITableView. I do not want to segue away from the view.

    Any help would be appreciated.

    Here's the screen shot as requested. Please note that the interface is a work in progress, the textfield will be going away.

    Screen Shot