DataSource
- Access to Data
- How many columns do I have?
func numberOfComponents(in pickerView: UIPickerView) -> Int { return .. }
- How many rows in a column?
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int{ return countries.count }
Delegate
- response to User Event
- Title for each row?
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { return countries[row] }
- What happens if the row is selected?
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { countryLabel.text = countries[row] }
Link the DataSource
and Delegate
outlets of the PickerView to the ViewController
Firstly, conform to the UIPickerViewDataSource and UIPickerViewDelegate protocols to implement PickerView
Option 1.In code
class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate {
@IBOutlet weak var countryPicker: UIPickerView!
@IBOutlet weak var countryLabel: UILabel!
// Data for Picker
var countries = ["Canada", "South Korea", "US", "UK", "China"]
override func viewDidLoad() {
super.viewDidLoad()
countryPicker.dataSource = self
countryPicker.delegate = self
}
...
Option 2.Select UIPickerView > connection inspector > connect both dataSource and delegate to the view controller
What if I want to use 2 pickers on the same ViewController?
--> set approriate tag value
to picker and use that to differentiate
How to access the selected value on a button click
-> Use .selectedRow(inComponent: #)
@IBAction func showPickerData(_ sender: Any) {
let countryIndex = countryPicker.selectedRow(inComponent: 0)
print("selected country: \(countries[countryIndex])")
}
Top comments (0)