Search code examples
iosswiftdelegatesdatasourceuipickerview

Multiple Custom Picker Views on a single viewController


Im trying to have two different pickerViews on the same viewController. And have them represent different data. I have tried a couple different ways to do this and seen couple of similar situations to mine on here, but can't put it all together. Any help would be awesome!

Here is all relevant code:

@IBOutlet weak var txtGoalTime: UITextField!
@IBOutlet weak var goalTimePicker: UIPickerView!

@IBOutlet weak var segIntensityZones: UISegmentedControl!

@IBOutlet weak var distanceLabel: UILabel!
@IBOutlet weak var distancePicker: UIPickerView!

@IBOutlet weak var lblPaceTime: UILabel!

let pickerData = [["\(1000)", "\(500)", "\(200)", "\(100)", "\(50)"], ["\(1000)", "\(500)", "\(200)", "\(100)", "\(50)"]]
var intensityZone = 1.0
let goalTimePickerData = [["\(1)", "\(2)", "\(3)", "\(4)", "\(5)", "\(6)", "\(7)", "\(8)", "\(9)", "\(10)", "\(11)"], ["\(1)", "\(2)", "\(3)", "\(4)", "\(5)", "\(6)", "\(7)", "\(8)", "\(9)", "\(10)","\(11)", "\(12)", "\(13)", "\(14)", "\(15)", "\(16)", "\(17)", "\(18)", "\(19)", "\(20)", "\(21)", "\(22)", "\(23)", "\(24)", "\(25)", "\(26)", "\(27)", "\(28)", "\(29)", "\(30)", "\(31)", "\(32)", "\(33)", "\(34)", "\(35)", "\(36)", "\(37)", "\(38)", "\(39)", "\(40)","\(41)", "\(42)", "\(43)", "\(44)", "\(45)", "\(46)", "\(47)", "\(48)", "\(49)", "\(50)", "\(51)", "\(52)", "\(53)", "\(54)", "\(55)", "\(56)", "\(57)", "\(58)", "\(59)", "\(60)"], [".\(1)", ".\(2)", ".\(3)", ".\(4)", ".\(5)", ".\(6)", ".\(7)", ".\(8)", ".\(9)"]]

override func viewDidLoad() {
    super.viewDidLoad()
    distancePicker.delegate = self
    distancePicker.dataSource = self

    goalTimePicker.delegate = self
    goalTimePicker.dataSource = self

    distanceLabel.textAlignment = .Center
    distanceLabel.numberOfLines = 2

    var tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "dismissKeyboard")
    view.addGestureRecognizer(tap)
}

//MARK: UIPickerViewDataSource
func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
    return pickerData.count
}
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    return pickerData[component].count
}

//MARK: UIPickerViewDelegate
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
    return pickerData[component][row]
}

func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    updateLabel()
}

Solution

  • Essentially, you need to check which picker is calling your delegate methods. Something like:

    //MARK: UIPickerViewDataSource
    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
       if pickerView == goalTimePicker {
            return goalTimePickerData.count
       } else if pickerView == distancePicker {
            return pickerData.count
       }
       return 0
    }
    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
       if pickerView == goalTimePicker {
            // return rows for component for goal time picker
       } else if pickerView == distancePicker {
            // return rows of component for distance picker
       }    
    }
    
    //MARK: UIPickerViewDelegate
    func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
       if pickerView == goalTimePicker {
            // etc
       } else if pickerView == distancePicker {
            // etc
       }    
    }
    
    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
       if pickerView == goalTimePicker {
            // etc
       } else if pickerView == distancePicker {
            // etc
       }   
    }