Search code examples
iosswift3tagsuipickerview

2 PickerViews on same ViewController - titleForRow fund "will not be executed"


I've tagged the PickerViews 1 and 2 but I'm getting a "will not be executed" message on the func titleForRow, how do I solve this?

@IBOutlet weak var shoeDetailPic: UIImageView!
@IBOutlet weak var shoeDetailName: UILabel!
@IBOutlet weak var shoeDetailPrice: UILabel!
@IBOutlet weak var shoeColourPickerView: UIPickerView!
@IBOutlet weak var shoeSizePickerView: UIPickerView!

var pickerColour = [""]
var pickerSize = [""]

var getName = String()
var getPrice = String()
var getImage = UIImage()


override func viewDidLoad() {
super.viewDidLoad()


shoeDetailPic.image = getImage
shoeDetailName.text = getName
shoeDetailPrice.text = getPrice

pickerColour = ["Gold", "Black", "Red"]
pickerSize = ["35", "36", "37", "38", "39", "40", "41", "42"]

}




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

func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
    return 1

}

func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component:   Int) -> Int {
    if (pickerView.tag == 1){
        return pickerColour.count
    }else{
        return pickerSize.count
    }

Message here - will not be executed. Is it something to do with the IBOutlet names?

  func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent    component: Int) -> String?{
        if (pickerView.tag == 1){
            return "\(pickerColour[row])"
        }else{
            return "\(pickerSize[row])"
        }

}
}
}

Solution

  • Problem is you have put titleForRow delegate method inside the numberOfRowsInComponent, it should be outside of that method as instance method of class.

    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }
    
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        if (pickerView == shoeColourPickerView){
            return pickerColour.count
        }else{
            return pickerSize.count
        }
    }
    
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        if (pickerView == shoeColourPickerView){
            return pickerColour[row]
        }else{
            return pickerSize[row]
        }
    
    }
    

    Note: You have already created outlet for both pickerView then instead of comparing tag in delegate method it is batter if you compare with your outlet.