How to create custom custom date picker options in the same UIView in swift

I am trying to create two different pickerViews on the same viewController and let them present different data. I have tried other ways to do this, but both date picker views display the same data, but cannot put it all together. I am new to rapid programming. Any help would be awesome!

 @IBOutlet weak var EventStart: UITextField!
var datepicker = UIDatePicker()
var datepicker2 = UIDatePicker()
@IBOutlet weak var EventEnd: UITextField!

override func viewDidLoad() {
    super.viewDidLoad()

    createDatePicker()
    Event.delegate = self
    eventName.delegate = self
    // Do any additional setup after loading the view.
}
func createDatePicker(){

    datepicker.datePickerMode = .dateAndTime
    datepicker2.datePickerMode = .dateAndTime
    let toolbar = UIToolbar()
    toolbar.sizeToFit()
    let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: nil, action: #selector(donePressed))
    toolbar.setItems([doneButton], animated: false)
    EventEnd.inputAccessoryView = toolbar
    EventEnd.inputView = datepicker2
    EventStart.inputAccessoryView = toolbar
    EventStart.inputView = datepicker
}

func donePressed(){
    let dateFormatter = DateFormatter()
    dateFormatter.dateStyle = .medium
    dateFormatter.timeStyle = .none
    EventStart.text = dateFormatter.string(from: datepicker.date)
    EventEnd.text = dateFormatter.string(from: datepicker2.date)
    print(EventStart)
    print(EventEnd)
    self.view.endEditing(true)
}

      

+3


source to share


2 answers


@IBOutlet weak var EventStart: UITextField!
var datepicker = UIDatePicker()
var datepicker2 = UIDatePicker()
@IBOutlet weak var EventEnd: UITextField!

override func viewDidLoad() {
    super.viewDidLoad()

   self.addDatePicker(datepicker, textfield:EventStart , selector: #selector(ViewController.donePressed))
    self.addDatePicker(datepicker2 , textfield:EventEnd ,selector: #selector(ViewController.donePressed2))

    // Do any additional setup after loading the view.
}


func addDatePicker(_ datepicker : UIDatePicker, textfield: UITextField, selector: Selector) {


    let toolbar = UIToolbar()
    toolbar.sizeToFit()
    let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: nil, action:selector)
    toolbar.setItems([doneButton], animated: false)


    textfield.inputAccessoryView = toolbar
    textfield.inputView = datepicker

}

func donePressed(){
    let dateFormatter = DateFormatter()
    dateFormatter.dateStyle = .medium
    dateFormatter.timeStyle = .none
    EventStart.text = dateFormatter.string(from: datepicker.date)
    print(EventStart)
    self.view.endEditing(true)
}

func donePressed2(){
    let dateFormatter = DateFormatter()
    dateFormatter.dateStyle = .medium
    dateFormatter.timeStyle = .none
    EventEnd.text = dateFormatter.string(from: datepicker2.date)
    print(EventEnd)
    self.view.endEditing(true)
}

      



0


source


The easiest way is to create two separate methods for two of them. Also, don't initialize them when loading the view.

This is my code for this.

var objDatePickerFrom: UIDatePicker!
var objDatePickerTo: UIDatePicker!

      

Then, on the corresponding button, tap as shown below (You also do this in the textview delegate method if you are not using buttons.)

@IBAction func btnFromDateTapped(_ sender: UIButton) {
    self.initDatePikerFrom(frame: self.view.frame)
}

@IBAction func btnToDateTapped(_ sender: UIButton) {
    self.initDatePikerTo(frame: self.view.frame)
}

      



Following are the methods for date picker initiators.

func  initDatePikerFrom(frame: CGRect)  {
    self.objDatePickerFrom = UIDatePicker()
    objDatePickerFrom.backgroundColor = UIColor.white
    objDatePickerFrom.datePickerMode = .date
    if DeviceType.IS_IPHONE_4_OR_LESS
    {
        objDatePickerFrom?.frame.size = CGSize(width: frame.size.width, height: 150)
    }
    self.txtFromDate.inputView = objDatePickerFrom

    objDatePickerFrom.maximumDate = Date()

    if self.txtFromDate.text! != "" {
        objDatePickerFrom.date = CommonFunctions.getDate(date: self.txtFromDate.text!)
    }
    self.view.bringSubview(toFront: objDatePickerFrom)
    let numberToolbar = UIToolbar(frame: CGRect.init(x: 0.0, y: 0.0, width: frame.size.width, height: 40.0))
    numberToolbar.barStyle = UIBarStyle.default
    numberToolbar.barTintColor = NavigationBGColor
    numberToolbar.layer.borderColor = UIColor(red: 79.0/255.0, green: 157.0/255.0, blue: 191.0/255.0, alpha: 1.0).cgColor
    numberToolbar.layer.borderWidth = 0.0
    let lblSelect = UILabel(frame: CGRect.init(x: 0, y: 0, width: 150, height: 30))
    lblSelect.text = "Select Date"
    lblSelect.textColor = WhiteFontColor
    lblSelect.textAlignment = .center

    let btnBarCancel = UIBarButtonItem(title: "Cancel", style: UIBarButtonItemStyle.plain, target: self, action: #selector(MyAccountViewController.btnCancelFromDateClick(_:)) )
    btnBarCancel.tintColor = WhiteFontColor

    let btnBarDone = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.done, target: self, action: #selector(MyAccountViewController.btnDoneFromDateClick(_:)) )
    btnBarDone.tintColor = WhiteFontColor

    numberToolbar.items = [
        btnBarCancel,
        UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil),
        UIBarButtonItem.init(customView: lblSelect),
        UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil),
        btnBarDone]
    numberToolbar.sizeToFit()
    self.txtFromDate.inputAccessoryView = numberToolbar
    self.txtFromDate.isUserInteractionEnabled = true
    self.txtFromDate.delegate = self
    self.txtFromDate.becomeFirstResponder()
}

func  initDatePikerTo(frame: CGRect)  {
        self.objDatePickerTo = UIDatePicker()
        self.objDatePickerTo.backgroundColor = UIColor.white
        self.objDatePickerTo.datePickerMode = .date
        if DeviceType.IS_IPHONE_4_OR_LESS
        {
            self.objDatePickerTo?.frame.size = CGSize(width: frame.size.width, height: 150)
        }
        self.txtToDate.inputView = self.objDatePickerTo

        self.objDatePickerTo.maximumDate = Date()

        if self.txtToDate.text! != "" {
            self.objDatePickerTo.date = CommonFunctions.getDate(date: self.txtToDate.text!)
        }
        self.view.bringSubview(toFront: self.objDatePickerTo)
        let numberToolbar = UIToolbar(frame: CGRect.init(x: 0.0, y: 0.0, width: frame.size.width, height: 40.0))
        numberToolbar.barStyle = UIBarStyle.default
        numberToolbar.barTintColor = NavigationBGColor
        numberToolbar.layer.borderColor = UIColor(red: 79.0/255.0, green: 157.0/255.0, blue: 191.0/255.0, alpha: 1.0).cgColor
        numberToolbar.layer.borderWidth = 0.0
        let lblSelect = UILabel(frame: CGRect.init(x: 0, y: 0, width: 150, height: 30))
        lblSelect.text = "Select Date"
        lblSelect.textColor = WhiteFontColor
        lblSelect.textAlignment = .center

        let btnBarCancel = UIBarButtonItem(title: "Cancel", style: UIBarButtonItemStyle.plain, target: self, action: #selector(MyAccountViewController.btnCancelToDateClick(_:)) )
        btnBarCancel.tintColor = WhiteFontColor

        let btnBarDone = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.done, target: self, action: #selector(MyAccountViewController.btnDoneToDateClick(_:)) )
        btnBarDone.tintColor = WhiteFontColor

        numberToolbar.items = [
            btnBarCancel,
            UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil),
            UIBarButtonItem.init(customView: lblSelect),
            UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil),
            btnBarDone]
        numberToolbar.sizeToFit()
        self.txtToDate.inputAccessoryView = numberToolbar
        self.txtToDate.isUserInteractionEnabled = true
        self.txtToDate.delegate = self
        self.txtToDate.becomeFirstResponder()
    }

      

Other similar methods similar to yours donePressed()

are listed below.

func btnDoneFromDateClick(_ sendre: AnyObject)
{
    let date = CommonFunctions.getStrDate(date: self.objDatePickerFrom.date)
    self.txtFromDate.text = "\(date.day) \(date.month) \(date.year)"
    self.txtFromDate.resignFirstResponder()
    self.txtFromDate.isUserInteractionEnabled = false
}

func btnDoneToDateClick(_ sendre: AnyObject)
{
    let date = CommonFunctions.getStrDate(date: self.objDatePickerTo.date)
    self.txtToDate.text = "\(date.day) \(date.month) \(date.year)"
    self.txtToDate.resignFirstResponder()
    self.txtToDate.isUserInteractionEnabled = false
}

      

May this help you.
Happy coding :)

0


source







All Articles