徒然エンジニアブログ

徒然エンジニアブログ

理系東大生がプログラミングを中心に様々なことについて情報発信していきます!

【Swift】UIDatePickerで時刻を選択する方法

アプリを使っているときに
下のようなものを見たことはありませんか?
これの名前がUIDatePickerで、日付や時刻などをドラムロールで選択することができます。
今回はこれの説明です。

f:id:turedureengineer:20181202231450p:plain

UIDatePickerをインスタンス化して細かい設定をする

インスタンス化は以下のコードでできます。
このインスタンス化のやり方は見慣れないかもしれませんが、{}の中のコードが実際にインスタンス化されるまで実行されないので、処理を早くできます。

let datePicker: UIDatePicker = {
        let dp = UIDatePicker()
        dp.datePickerMode = UIDatePicker.Mode.dateAndTime
        dp.timeZone = NSTimeZone.local
        dp.locale = Locale.current
        dp.addTarget(self, action: #selector(dateChange), for: .valueChanged)
        return dp
    }()

これを丸写しするだけでできます。
さらに dp.addTarget(self, action: #selector(dateChange), for: .valueChanged)というところで選択している値が変わるたびにdateChangeという関数を呼ぶという設定にしてます。

@objc func dateChange(){
        let formatter = DateFormatter()
        formatter.dateFormat = "MM/dd hh:mm"
        timeLimitTextField.text = "\(formatter.string(from: datePicker.date))"
    }

dateChange関数はこんな感じで良いでしょう。フォーマットは好きに変えてもらって構いません。

実際に適用させる

今回はtextFieldを選択するとキーボードの代わりにdatePickerが表示されて欲しいのでviewDidLoadの中で

timeTextField.inputView = datePicker

とします。
もちろん

let timeTextField = UITextField()

と宣言しておかないとダメです。

キーボードで入力できないようにする

シミュレーターで動かしてみた人はわかると思いますが、今のままだとキーボードによる入力も受け付けてしまいます。
これは厄介なのでそうならないようにしておきましょう。
まずはこれが書いてあるクラスにUITextFieldDelegateプロトコルを継承させてください。
そしてviewDidLoadの中で

timeLimitTextField.delegate = self

とします。
そして以下の関数をコピペしてください。

func textField(_ textField: UITextField,
                   shouldChangeCharactersIn range: NSRange,
                   replacementString string: String) -> Bool {
        // キーボード入力や、カット/ペースによる変更を防ぐ
        return false
    }