objective-cxcodensdatensdatecomponentsformatter

Working with Date and Time separately using NSDatePickerView on Xcode


I have a part of app that set date and time of an appointment. For this, I have two NSDatePickerView. The first one I set to NSDatePickerModeDate, while the other one to NSDatePickerModeTime. But actually they should be referring to a same NSDate object inside a NSMutableDictionary entry. I know about NSDatePickerModeDateTime, but I need the date and time to be picked separatedly.

I know how to set up the NSDatePickerView to show and hide and event control and such, but at the event control UIControlEventValueChanged fire for NSDatePickerView, I'm confused on how to code the change for this, and also how to initialise the pickers (datePicker.date = today, timePicker.date = "9:00 AM")

@interface MyViewController () {
    NSMutableDictionary *data;
}

@end

@implementation MyViewController

@synthesize datePicker, timePicker;

- (void) viewDidLoad {
    [super viewDidLoad];
    data = [[NSMutableDictionary alloc] init];
    [data setObject:[NSDate date] forKey:@"date"];

    datePicker.datePickerMode = UIDatePickerModeDate;
    timePicker.datePickerMode = UIDatePickerModeTime;

    [datePicker addTarget:self action:@selector(changeDate:) forControlEvents:UIControlEventValueChanged];
    [timePicker addTarget:self action:@selector(changeTime:) forControlEvents:UIControlEventValueChanged];

    datePicker.date = data[@"date"]; //????
    timePicker.date = data[@"date"]; //????
}

- (IBAction) changeDate:(id)sender {
    UIDatePickerView *dp = (UIDatePickerView *)sender;
    [data setObject:dp.date forKey:@"date"]; //????
}

- (IBAction) changeTime:(id)sender {
    UIDatePickerView *tp = (UIDatePickerView *)sender;
    [data setObject:tp.date forKey:@"date"]; //????
}

The part that I don't know how to code it is denoted by //????. I've read about NSDateFormatter, NSCalendar, and some kind of date components on some answers, but that was actually making me more confused as it also throws strings and structs into the mix, what to use to do what and when. Please help.


Solution

  • You can set both date pickers to the same date and time. The unused part is there but it isn't displayed and can't be changed. When the user changes the value of one date picker you have to set the other date picker to the same value.

    - (IBAction)changeDate:(id)sender {
        NSDatePicker *dp = (NSDatePicker *)sender;
        [data setObject:dp.dateValue forKey:@"date"];
        self.timePicker.dateValue = dp.dateValue;
    }
    
    - (IBAction)changeTime:(id)sender {
        NSDatePicker *tp = (NSDatePicker *)sender;
        [data setObject:tp.dateValue forKey:@"date"];
        self.datePicker.dateValue = tp.dateValue;
    }