Powered By Blogger

2011年4月26日火曜日

iOS:年月日時分を一つのUIDatePickerで入力する

UIDatePickerはプロパティdatePickerModeを変更することで、年月日モードと月日時分(または時分)モードに変更出来る。


それでは年月日時分を一つのUIDatePickerで入力したい場合はどうするのだろうか。
Pickerを二つ用意してそれぞれ年月日用と時分用に分けるのは常套手段かもしれないが、画面を二つに分ける事になり少し面倒臭い。


ユーザーのボタン選択によりdatePickerModeを動的に変えれば良いのではないか。
ボタン押下で下のswitchDateTimeを呼ぶようにする。
//

- (IBAction) switchDateTime {
  switch (datePicker_.datePickerMode) {
    case UIDatePickerModeDate: {
      datePicker_.datePickerMode = UIDatePickerModeDateAndTime;
      [swBtn_ setTitle:NSLocalizedString(@"swichBtn_date", @"") forState:UIControlStateNormal];
    } break;
    case UIDatePickerModeDateAndTime: {
      datePicker_.datePickerMode = UIDatePickerModeDate;
      [swBtn_ setTitle:NSLocalizedString(@"swichBtn_time", @"") forState:UIControlStateNormal];
    } break;
    default:
      assert(0);
      break;
  }
}
うまくいった!!ボタンを押す度にPickerの形が変わる。
と、思いきや駄目だ、モードを切り替えると時分が0時0分に戻ってしまう。
年月日は入力した値が保たれているが、時分だけは幾ら入力してもモードを切り替えると0:00になってしまう。
この様な使い方は想定されていないのか、UIDatePickerは UIDatePickerModeDateでは時分の値を保持しないらしい。


ならばUIDatePickerModeDateに変える直前で日付データを一時退避し後で書き戻す事にする。

//

- (IBAction) switchDateTime {
  switch (datePicker_.datePickerMode) {
    case UIDatePickerModeDate: {
      datePicker_.datePickerMode = UIDatePickerModeDateAndTime;
      [swBtn_ setTitle:NSLocalizedString(@"swichBtn_date", @"") forState:UIControlStateNormal];
    } break;
    case UIDatePickerModeDateAndTime: {
      NSDate *tmp = [datePicker_.date copy]; //<-ここで一時退避
      datePicker_.datePickerMode = UIDatePickerModeDate;
      datePicker_.date = tmp;                          //<-ここで書き戻す
      [tmp release];
      [swBtn_ setTitle:NSLocalizedString(@"swichBtn_time", @"") forState:UIControlStateNormal];
    } break;
    default:
      assert(0);
      break;
  }
}
モードを切り替えても時分は保持されている。
取りあえず問題は解決した様だ。

0 件のコメント:

コメントを投稿