UIDatePicker を時刻の入力に使用していた

minuteInterval を 15にして 0分、15分、30分、45分のどれかを入力するようにしている。
更に、必ず今よりも古い時刻を入力することになるので、maximumDate を [NSDate date] として現在の時刻が最大値となるようにしていた。

基本的に今までこの状態で動いてはいたのだが、先日、不具合の報告があった。
内容は「入力した時刻が 00分にならずに 01分になっている」というもの。
時刻の入力時に手動で数値を入れるわけではなく、0, 15, 30, 45 の中からどれかを選択して入力なので 1が入る余地はない…はずなのだけど。

得られる時刻が15分間隔でない

で、見つけたのが UIDatePicker の動作のちょっと不思議な部分。(というか自分の思い込み?)


これは minuteInterval を 15分毎に設定した UIDatePicker に maximumDate を設定したという2つの設定が重なると起きる動作。


UIDatePicker に maximumDate を設定すると、ユーザがそれを越えた時刻を選択した場合に、UIDatePicker のドラムがクルクルっと回転してその UIDatePicker の取り得る値の最大値になる。この時 picker.date の値は 15分毎の時刻ではない時刻(picker.maximumDate)が入っている。
自分としては UI で見えている値(15分毎になっている値)になっていると思い込んでいたので、問題が生じた。

取り出した値が 0,15,30,45分 になっているかどうか?の確認をせずに値を使っていた自分も悪いのだけど、ちょっと「やられた!」って感じだった。


結局、picker の maximumDate を設定する時に [NSDate date] なんて手抜きをせずに、その時点で取り得る最大の 15分毎の数字を求めて設定することで問題は回避できた。


ま、考えてみれば 15分毎に設定したのに最大値に15分毎になっていない時刻を設定した自分が悪いんだな…。