UIPickerView

はじめに

徐々にアプリっぽくなってきた

実行環境

  • swift : 4.2.1
  • Xcode : 10.1

ソースコード

import UIKit

class SetTime: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
    
    // 選択肢
    let dataListSec  = Array(0...59)
    let dataListMin  = Array(0...59)
    let dataListHour = Array(0...8)
    
    @IBOutlet weak var picker: UIPickerView!
    
    override func viewDidLoad() {
        super.viewDidLoad()

        // プロトコル
        // storyboardからcontrolでViewの黄色いとこに接続すれば下の二つは記述しなくてもおkっぽい
        //picker.delegate = self
        //picker.dataSource = self
        
        // 表示する項目を指定
        self.picker.selectRow(1, inComponent: 0, animated: true) // hour
        self.picker.selectRow(0, inComponent: 1, animated: true) // min
        self.picker.selectRow(0, inComponent: 2, animated: true) // sec

    }
    
    
    // UIPickerViewDataSource
    
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        // 表示する列数
        return 3
    }
    
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        // アイテム表示個数を返す
        
        if component == 0 {
            return dataListHour.count
        }
        if component == 1 {
            return dataListMin.count
        }
        else {
            return dataListSec.count
        }
    }
    
    
    // UIPickerViewDelegate
    
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        // 表示する文字列を返す
        
        if component == 0 {
            return String(dataListHour[row])
        }
        if component == 1 {
            return String(dataListMin[row])
        }
        else {
            return String(dataListSec[row])
        }
    }
    
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        // 選択時の処理
        
        if component == 0 {
            // hour
            print(dataListHour[row])
        }
        if component == 1 {
            // min
            print(dataListMin[row])
        }
        else {
            // sec
            print(dataListSec[row])
        }
    }
}

storyboard

  • UIPickerとUILabelを配置
  • UIPickerはcontrol接続でstoryboardの上の黄色い丸のとこにやると、delegate, datasourceの記述を省けた。
  • UIPicker Outlet接続

commandクリックで記述すべきメソッドを確認

選択時の処理

  • func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)
    ここで選択した時間を取得して、セグエで値渡しできそう。んで遷移後カウントダウン。

課題

  • AutoLayout問題

思ったこと

コマンドクリック便利

参考文献

[Swift3] リストから項目を選択するUIPickerViewの使い方 - JoyPlotドキュメント