1

Here's my code . I am trying to use UIPickerview for few buttons with different data. but it show's me blank gray picker view when I run my project. some told me that I have to reload the pickerView but I used it for example "mainPV.delegate = self ..... Please I need help guys if someone can help me

import UIKit

class SearchBuyVC: UIViewController {

    @IBOutlet weak var optionV: UIView!

    @IBOutlet weak var doneBtn: UIButton!
    @IBOutlet weak var searchBtn: UIButton!

    // picker view
    @IBOutlet var mainPV: UIPickerView! // main
    @IBOutlet var secPV: UIPickerView! //type
    @IBOutlet var minPV: UIPickerView! //priceMin



    @IBOutlet weak var typeBtn: UIButton!

    @IBOutlet weak var PriceMinBtn: UIButton!

    var optionSelector = 0
    let searchData = ["Search by Areas", "Search by Map", "Search by LRT/MRTs", "Search by Schools", "Search by Propery Name"]

    let typeData = ["All Residental", "All Commerical"]
    let minNum = ["Any", "100 k", "200 k", "300 k", "400 k", "500 k", "600k ", "700 k"]

    override func viewDidLoad() {
        super.viewDidLoad()
        setUpNav(arrowType: 2)

       mainPV = UIPickerView()
       secPV = UIPickerView()
        minPV = UIPickerView()
       mainPV.delegate = self
        secPV.delegate = self
        minPV.delegate = self

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

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        //Dispose of any resources that
    }

    override func viewDidAppear(_ animated: Bool) {
        self.navigationController?.setNavigationBarHidden(false, animated: true)
    }

    @IBAction func selectOptionsPressed(_ sender: Any) {

        openOptions()
        mainPV.delegate = self
        secPV.delegate = self
        minPV.delegate = self

    }

    @IBAction func typeSelect(_ sender: Any) {
        openOptions()
        mainPV.delegate = self
        secPV.delegate = self
        minPV.delegate = self
    }


    @IBAction func minPriceBtn(_ sender: Any) {
        openOptions()
        mainPV.delegate = self
        secPV.delegate = self
        minPV.delegate = self

    }








    @IBAction func donePressed(_ sender: Any) {
        switch optionSelector {
        case 0:
            FiltersController.instance.showAreaFilter(nc: self.navigationController!)
        case 1:
            FiltersController.instance.showMapFilter(nc: self.navigationController!)
        case 2:
            FiltersController.instance.showTrainStations(nc: self.navigationController!)
        case 3:
            FiltersController.instance.showSchoolFilter(nc: self.navigationController!)
        default:
            FiltersController.instance.showNameFilter(nc: self.navigationController!)
        }
        closeOptions()
    }

    func openOptions() {
        optionV.isHidden = false
        mainPV.isHidden = false
        minPV.isHidden = false
        doneBtn.isHidden = false
        secPV.isHidden = false
    }

    func closeOptions(){
        optionV.isHidden = true
        mainPV.isHidden = true
        minPV.isHidden = true
        doneBtn.isHidden = true
        secPV.isHidden = true
    }

    @IBAction func nextPressed(_ sender: Any) {
        ListingController.instance.showBuyListing(nc: self.navigationController!)
    }
}

extension SearchBuyVC: UIPickerViewDelegate, UIPickerViewDataSource {


    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {



        if pickerView == mainPV {
            return searchData.count
        }

        return 1
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        if pickerView == mainPV{
            return searchData[row]
        }
        if pickerView == secPV{
            return typeData[row]

        }
        if pickerView == minPV{
            return minNum[row]
        }
        return ""
    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        optionSelector = row
        if pickerView == mainPV{
            searchBtn.setTitle(searchData[row], for: .normal)
        }
        if pickerView == secPV{
            typeBtn.setTitle(typeData[row], for: .normal)
        }

        if pickerView == minPV{
            PriceMinBtn.setTitle(minNum[row], for: .normal)

        }
    }
}
RajeshKumar R
  • 15,445
  • 2
  • 38
  • 70
  • mainPV = UIPickerView() secPV = UIPickerView() minPV = UIPickerView() remove all this cause loading empty view and mainPV.dataSource = self secPV.dataSource = self minPV.dataSource = self which will show picker view all datas in each – Vinodh Apr 01 '19 at 14:09
  • func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { if pickerView == mainPV{ return searchData.count } if pickerView == secPV{ return typeData.count } if pickerView == minPV{ return minNum.count } return 1 }. pass each data clearly for each picker view – Vinodh Apr 01 '19 at 14:11

2 Answers2

0

Also need to set dataSource for the pickerViews. So that the methods of UIPickerViewDataSource called which are responsible for returning all the data to UIPickerView. Your class must to confirm the UIPickerViewDataSource protocol.

Ex:

picker_country.dataSource = self
RPK
  • 11
  • 3
0

At first import the UIPickerView protocols within the class as,

class SearchBuyVC: UIViewController  UIPickerViewDelegate, UIPickerViewDataSource

and add the following lines also to call the datasource functions,

mainPV.delegate = self
secPV.delegate = self
minPV.delegate = self
mainPV.dataSource = self
secPV.dataSource = self
minPV.dataSource = self
Angel F Syrus
  • 1,984
  • 8
  • 23
  • 43