Swift - Programmatically create and display UIPickerView when BarButtonItem is pressed

30,921

You never add the pickerView as a subview of the ViewController, which you can do in viewDidLoad() since you're hiding it. Then when you unhide it your view should be there.

EDIT: Added Code

override func viewDidLoad() {
    super.viewDidLoad()
    self.typePickerView.hidden = true
    //other pickerView code like dataSource and delegate
    self.view.addSubview(pickerView) //will add the subview to the view hierarchy
}

With the above code, now when you unhide it on button press the view will show up.

Share:
30,921
Javz
Author by

Javz

Full Stack .Net Developer Here to help and get help :)

Updated on August 14, 2022

Comments

  • Javz
    Javz almost 2 years

    Initially I wanted to add a hidden UIPickerView onto the Main.storyboard alongside my existing UISearchBar and when a BarButtonItem is clicked, the UIPickerView should be displayed; but it appears I cannot have them both at once in a given space.

    So instead, my best alternative was to create it programmatically. I've followed existing tutorials (http://sourcefreeze.com/ios-uipickerview-example-using-swift/) and similar questions (Programmatically Create and Show UIPickerView) and seems like I do (?) have a UIPickerView as the description of it is being printed and I get the following:

    <UIPickerView: 0x7f86425b1fb0; frame = (100 100; 100 162); layer = <CALayer: 0x7f8642543a20>>
    

    Here is part of my current code which may be of help:

    AnimalTableViewController.swift

    import UIKit
    
    class AnimalTableViewController: UITableViewController, UINavigationControllerDelegate, UISearchBarDelegate, UISearchDisplayDelegate, UISearchResultsUpdating, UIPickerViewDelegate, UIPickerViewDataSource {
    
        @IBOutlet var segmentedSortOption: UISegmentedControl!
        var array : NSArray = Animal.animalStruct.jsonResult["animal"] as NSArray
        var filteredArray = [[String:AnyObject]]()
        var timer = NSTimer()
        var counter:Int = 1
        var typePickerView: UIPickerView = UIPickerView()
    
        @IBOutlet var typeBarButton: UIBarButtonItem!
        var resultSearchController = UISearchController()
    
        var indexArray:String!
    
        @IBAction func refresh(sender: AnyObject) {
    
            self.tableView.reloadData()
            println("refreshed")
        }
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            self.typePickerView.hidden = true
            self.typePickerView.dataSource = self
            self.typePickerView.delegate = self
            self.typePickerView.frame = CGRectMake(100, 100, 100, 162)
            self.typePickerView.backgroundColor = UIColor.blackColor()
            self.typePickerView.layer.borderColor = UIColor.whiteColor().CGColor
            self.typePickerView.layer.borderWidth = 1        
            timer = NSTimer.scheduledTimerWithTimeInterval(0.2, target: self, selector: Selector("result"), userInfo: nil, repeats: true)
    
            self.resultSearchController = ({
                let controller = UISearchController(searchResultsController: nil)
                controller.searchResultsUpdater = self
                controller.dimsBackgroundDuringPresentation = false
                controller.searchBar.sizeToFit()
    
                self.tableView.tableHeaderView = controller.searchBar
    
                return controller
            })()
        }
    
        func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
            return 1
        }
    
        func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
            return array.count
        }
    
        func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
            return array[row]["type1"] as String
        }
    
        func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
            typeBarButton.title = array[row]["type1"] as? String
            typePickerView.hidden = false
        }
    
        func pickerView(pickerView: UIPickerView, widthForComponent component: Int) -> CGFloat {
            return 36.0
        }
    
        func pickerView(pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat {
            return 36.0
        }
    
        @IBAction func typePickerViewSelected(sender: AnyObject) {
            typePickerView.hidden = false
            println(typePickerView.description)
        }
    
    }
    

    Please could you help me display the programmatically created UIPickerView when the BarButtonItem is pressed? If you have any more questions, please do ask.

    Many thanks.

  • Javz
    Javz over 8 years
    Could you please show me an example? As I am not entirely sure what you mean by that. Would you want me to add it into the ViewController? Though it's being declared on the TableViewController. Thanks
  • Faizan Mubasher
    Faizan Mubasher over 6 years
    Still not working and I am unable to find reason. I am trying to open it on UIView Tap.