Search code examples
swiftuipickerviewuitoolbar

Done Toolbar on UIPickerView


So I have a button on a page when clicked I am opening up a picker view. I have populated the picker view with the months. I added a toolbar but whenever I try to select it just scrolls the picker view to the top.

    monthPicker = UIPickerView(frame: CGRect(x: 0, y: self.view.frame.size.height- monthPicker.frame.size.height, width: self.view.frame.size.width, height: monthPicker.frame.size.height))
    monthPicker.delegate = self
    monthPicker.dataSource = self
    monthpickerData = ["January","February","March","April","May","June","July","August","September","October","November","December"]
    monthPicker.backgroundColor = UIColor.white
    //
    let btnDone = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(self.monthdoneButtonAction))
    let barAccessory = UIToolbar(frame: CGRect(x: 0, y: 0, width: monthPicker.frame.size.width, height: 44))
    barAccessory.barStyle = .default
    barAccessory.isTranslucent = false
    barAccessory.items = [flexiblespace,btnDone]
    monthPicker.addSubview(barAccessory)

enter image description here


Solution

  • It seems like UIPickerView is not letting its children receive touch events. If you are showing this in conjunction with UITextField you can use it's inputView and inputAccessoryView to acheive the same. Alternatively you can create a top level container UIView to hold both toolbar and picker view like this:

        let picker = UIView(frame: CGRect(x: 0, y: view.frame.height - 260, width: view.frame.width, height: 260))
    
        // Toolbar
        let btnDone = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(self.monthdoneButtonAction))
        let spaceButton = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
        let cancelButton = UIBarButtonItem(title: "Cancel", style: .plain, target: self, action: #selector(self.cancelClick))
    
        let barAccessory = UIToolbar(frame: CGRect(x: 0, y: 0, width: picker.frame.width, height: 44))
        barAccessory.barStyle = .default
        barAccessory.isTranslucent = false
        barAccessory.items = [cancelButton, spaceButton, btnDone]
        picker.addSubview(barAccessory)
    
        // Month UIPIckerView
        monthPicker = UIPickerView(frame: CGRect(x: 0, y: barAccessory.frame.height, width: view.frame.width, height: picker.frame.height-barAccessory.frame.height))
        monthPicker.delegate = self
        monthPicker.dataSource = self
        monthpickerData = ["January","February","March","April","May","June","July","August","September","October","November","December"]
        monthPicker.backgroundColor = UIColor.white
        picker.addSubview(monthPicker)