UIPickerViewの使い方です。TableViewのように、Delegate,Datasourceを指定して使います。
同じビューに対して複数使う場合は、Storyboardで各PickerViewに対してIDを指定して、場合分けが必要です。
<h3> 実行環境 </h3>
Swift:5.0
Xcode:10.2.1
<h3> UIPickerViewの使い方 </h3>
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 61 62 63 64 65 66 67 68 69 70 71 72 73 |
import UIKit class ViewController: UIViewController,UIPickerViewDelegate,UIPickerViewDataSource { @IBOutlet weak var gradePickerView: UIPickerView! @IBOutlet weak var genderPickerView: UIPickerView! @IBOutlet weak var jobStatusPickerView: UIPickerView! @IBOutlet weak var label: UILabel! @IBOutlet weak var button: UIButton! var dataSourceForGrade = [1,2,3,4] var dataSourceForGender = ["男性","女性"] var dataSourceForJobStatus = ["就活していない","就活準備中","就活中","就活終了"] override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. self.gradePickerView.delegate = self self.gradePickerView.dataSource = self self.genderPickerView.delegate = self self.genderPickerView.dataSource = self self.jobStatusPickerView.delegate = self self.jobStatusPickerView.dataSource = self } @IBAction func tapButton(_ sender: Any) { let grade = dataSourceForGrade[self.gradePickerView.selectedRow(inComponent: 0)] let gender = dataSourceForGender[self.genderPickerView.selectedRow(inComponent: 0)] let jobStatus = dataSourceForJobStatus[self.jobStatusPickerView.selectedRow(inComponent: 0)] self.label.text = "私は\(grade)年生の\(gender)で、\(jobStatus)です。" } //ひとつのPickerViewに対して、横にいくつドラムロールを並べるかを指定。通常は1でOK func numberOfComponents(in pickerView: UIPickerView) -> Int { return 1 } //PickerViewの選択肢の個数を返す処理。複数のpickerViewがある場合は、tagをStoryboard上で設定して場合分けをする func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { if pickerView.tag == 1{ return dataSourceForGrade.count } else if pickerView.tag == 2{ return dataSourceForGender.count } else if pickerView.tag == 3{ return dataSourceForJobStatus.count } else { return 0 } } //PickerViewの選択肢として表示する文字列を設定(これがないと、?として表示されてしまう) func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { if pickerView.tag == 1{ return String(dataSourceForGrade[row]) } else if pickerView.tag == 2{ return String(dataSourceForGender[row]) } else if pickerView.tag == 3{ return String(dataSourceForJobStatus[row]) } else{ return "" } } } |
Delegateのプロトコルを指定すると、必要なデリゲートメソッドの記述をするように自動で警告が出て、クリックすると、勝手にそれらのメソッドを追加してくれる。それはいいのだが、なぜか下記のメソッドは自動では追加されない。無くても動くには動くが、事実上必須みたいなものではないだろうか。
1 |
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? |