UIDatePickerのタイマーで0分に設定しても1分(60秒)になってしまう問題
2011-10-02
UIDatePickerのモードにはタイマー表示にする「UIDatePickerModeCountDownTimer」がありますが、このタイマー表示において0分(00:00)に設定したにも関わらず1分(00:01)が設定されたように振舞ってしまう問題があります。 今回はその解決策をご紹介。
具体的にはどういう現象か?
たとえば、以下のようにUIDatePickerインスタンスを作成して、モードを「UIDatePickerModeCountDownTimer」にしておき、何分おきの選択にするか(minuteInterval)を設定しておきます。
minuteIntervalプロパティは何分でも良いですが、ここでは仮に10分おきに設定しておきます。
UIDatePicker *picker = [[UIDatePicker alloc] initWithFrame:CGRectZero]; ...(省略)... picker.datePickerMode = UIDatePickerModeCountDownTimer; picker.minuteInterval = 10; ...(省略)...
これで時間と分を設定できるようになりますが、そこで「00:00」に合わせてcountDownDurationプロパティで秒数を取得すると「60」という数値、つまり1分を設定したような挙動になってしまうのです。
なぜ強制的に1分に設定されてしまうのか?
海外でも同様の質問があり、回答者が納得の解答をしてくれていました。
その解答を分かりやすく説明すると「そもそもこのタイマーモード表示はタイマー(一定時間からのカウントダウン計測)を設定するためのものなので、0分を設定すること自体が本末転倒である」ということです。 …なるほど(^-^;
とはいえ「『タイマー時間なし』など『00:00』をどうしても設定したい!」という需要があることも確か。
countDownDurationの条件で0を強制的に設定しよう
そこで解決策ですが、「00:00」を設定して完了する際に呼び出されるメソッド内でcountDownDurationプロパティをチェックして、60であれば0にするという対策を施しましょう。
ただ、こういった挙動はバグとして認識されているかもしれず今後iOSのアップデートによって仕様が変わる可能性があるので、あまりにこの挙動に依存したコードを書かないように、ラッパーしたメソッドに集約させておくなど事前対策をしておくのが賢明かと思います。
//秒数を保存しておくための変数 int sec = (int)[picker countDownDuration]; if (sec == 60) sec = 0;
このsec変数は再度pickerのcountDownDurationプロパティに設定してもちゃんと「00:00」になるので問題なく表示されます。 お役に立ちましたでしょうか?
2011-10-02