2

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])"
        }

}
}
}
Nirav D
  • 71,513
  • 12
  • 161
  • 183
Zed
  • 25
  • 4

1 Answers1

1

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.

Nirav D
  • 71,513
  • 12
  • 161
  • 183
  • Ahh I see! That has got rid of that problem but I now have this error – Zed Mar 29 '17 at 12:54
  • 2017-03-29 13:46:47.089 projectA[34754:2031417] -[projectA.shoeDetailViewController numberOfComponentsInPickerView:]: unrecognized selector sent to instance 0x7f939fd235a0 2017-03-29 13:46:48.685 projectA[34754:2031417] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[projectA.shoeDetailViewController numberOfComponentsInPickerView:]: unrecognized selector sent to instance 0x7f939fd235a0' – Zed Mar 29 '17 at 12:54
  • Yes I am using Swift 3 – Zed Mar 29 '17 at 12:57
  • @Zed Check this answer of my in Swift 3 delegate method's signature is changed http://stackoverflow.com/a/39933750/6433023 change your method like this will solve your problem – Nirav D Mar 29 '17 at 12:59
  • @Zed I have also edited answer with new methods replace your one with my edited methods – Nirav D Mar 29 '17 at 13:04
  • @Zed Edit your question with new code, add whole controller code – Nirav D Mar 29 '17 at 14:19
  • I was missing a data source connection...sorry I'm really new to this! Thanks for all your help, its all working now! – Zed Mar 29 '17 at 15:26
  • @Zed Welcome mate :) – Nirav D Mar 29 '17 at 17:26