1

I added a toolbar with done and cancel button but the buttons are not appearing on the toolbar. I could not find the cause of this issue. i tried many changes but the issue is not resolved.

This is the code regarding the toolbar:

   @IBOutlet weak var textFieldYear: UITextField!
   @IBOutlet weak var viewMonth: UIView!
   @IBOutlet weak var textFieldMonth: UITextField!
   @IBOutlet weak var viewDatePicker: UIView!
   @IBOutlet weak var datePicker: UIPickerView!

   func setUpDatePickerView(){
    let date = Date()
    arrYear.add(date.year)
    if date.month == "November" || date.month == "December" {
        let newDate = Calendar.current.date(byAdding: .year, value: 1, to: date)
        arrYear.add(newDate?.year ?? "")
    }
    let toolBar = UIToolbar().ToolbarPiker(mySelect: #selector(self.donePicker), cancel: #selector(self.dismissPicker))
    
   
    viewDatePicker.addSubview(toolBar)
    datePicker.reloadAllComponents()
    datePicker.selectRow(0, inComponent: 0, animated: true)
    textFieldYear.text = (arrYear[0] as! String)
    textFieldMonth.text = Calendar.current.date(byAdding: .month, value: 1, to: Date())?.month
    
}

// ToolBar

extension UIToolbar {

  func ToolbarPiker(mySelect : Selector, cancel : Selector) -> UIToolbar {

    let toolBar = UIToolbar()
    toolBar.barStyle = UIBarStyle.default
    toolBar.isTranslucent = true
    toolBar.tintColor = UIColor.black
    toolBar.sizeToFit()
   
    let doneButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.done, target: self, action: mySelect)
   
     
    let spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.fixedSpace, target: nil, action: nil)
    spaceButton.width = 225
    let cancelButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.cancel, target: self, action: cancel)
    
    toolBar.setItems([cancelButton, spaceButton, doneButton], animated: false)
    toolBar.isUserInteractionEnabled = true
   
    return toolBar
 }  
}

   @objc func donePicker() {
    self.view.endEditing(true)
 }

   @objc func dismissPicker() {
     self.view.endEditing(true)
     viewDatePicker.isHidden = true
 }

Sk Sk
  • 21
  • 5

2 Answers2

0

I think, you might be missing to add the toolbar as an accessory view to the input element. For example here we will add a toolbar as an accessory view to a textField.

textField1.inputAccessoryView = toolBar

Please let me know if it worked

0

I would subclass UITextField and add your pickerview and toolbar there:

import UIKit

class MonthField: UITextField, UIPickerViewDelegate, UIPickerViewDataSource {

    let pickerView = UIPickerView()
    var dataSource: [String] { return Calendar.current.monthSymbols }
    var month: Int = 0

    func numberOfComponents(in pickerView: UIPickerView) -> Int { return 1 }
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { return dataSource.count }
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { return dataSource[row] }
    // Configure toolbar and picker view
    override func didMoveToWindow() {
        let toolbar = UIToolbar()
        toolbar.setItems([
            .init(title: "Cancel", style: .plain, target: self, action:  #selector(cancel)),
            .flexibleSpace,
            .init(title: "Done", style: .plain, target: self, action:  #selector(done)),
        ], animated: false)
        pickerView.delegate = self
        pickerView.dataSource = self
        pickerView.selectRow(Date().month-1, inComponent: 0, animated: false)
        inputView = pickerView
        inputAccessoryView = toolbar
        toolbar.sizeToFit()
        placeholder = "Select Month"
    }

    override func caretRect(for position: UITextPosition) -> CGRect { return .zero }

    @objc func done(_ barButtonItem: UIBarButtonItem) {
        month = pickerView.selectedRow(inComponent: 0) + 1
        text = dataSource[month-1]
        endEditing(false)
    }
    @objc func cancel(_ barButtonItem: UIBarButtonItem) {
        endEditing(false)
    }
}

extension UIBarButtonItem {
    static let flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
}

extension Date {    
    var month: Int { return Calendar.current.component(.month, from: self) }
}

enter image description here

Leo Dabus
  • 229,809
  • 59
  • 489
  • 571