raptor
raptor

Reputation: 291

How to make UIDatePicker to show user selected time

I have a UIDatepicker where I am letting user chose time . UITableview is in a UIView where on click of a UIButton a UIDdatePicker appears, when the user choose a time and press back button to dismiss UIDdatePicker view and if he wants to check whats the time he had chose in UIDdatePicker. The UIDdatePicker doesn't show the time which the user had selected it shows the current time or the time start time of datepicker . I want to display the time user has chosen by the user when he opens datepicker again. This is my code for when user press UIButton to display UIDdatePicker view

-(IBAction)settingsButtonChanged:(UIButton *)sender
{

    userTimePicker = [[UIDatePicker alloc]init];
    [userTimePicker addTarget: self
                       action: @selector(userTimePickerValueChanged:)forControlEvents: UIControlEventValueChanged];
}

This is my code which lets datepicker have custom time limit

-(IBAction)datepickerTimenButtonChanged:(UIButton *)control
{

    if (control.tag == 1)
    {
        self.selectedButton = control.tag;

        int startTime = 7;
        int endTime = 11;

        NSDate *date1 = [NSDate date];
        components = [gregorian components: NSUIntegerMax fromDate: date1];

        [components setHour:startTime];;
        [components setMinute:00];

        NSDate *startDate = [gregorian dateFromComponents:components];

        [components setHour:endTime];
        [components setMinute:00];

        NSDate *endDate = [gregorian dateFromComponents:components];

        morningButton.selected = YES;
        afternoonButton.selected = NO;
        eveningButton.selected = NO;
        nightButton.selected = NO;

        [userTimePicker setDatePickerMode:UIDatePickerModeTime];

        [userTimePicker setMinimumDate:startDate];
        [userTimePicker setMaximumDate:endDate];

        [userTimePicker setDate:startDate animated:YES];
        [userTimePicker reloadInputViews];

    }

    if (control.tag == 2)
    {
        self.selectedButton = control.tag;

        morningButton.selected = NO;
        afternoonButton.selected = YES;
        eveningButton.selected = NO;
        nightButton.selected = NO;

        int startTime = 12;
        int endTime = 15;

        NSDate *date1 = [NSDate date];
        components = [gregorian components: NSUIntegerMax fromDate: date1];

        [components setHour:startTime];
        [components setMinute:00];

        NSDate *startDate = [gregorian dateFromComponents:components];

        [components setHour:endTime];
        [components setMinute:00];

        NSDate *endDate = [gregorian dateFromComponents:components];

        [userTimePicker setDatePickerMode:UIDatePickerModeTime];

        [userTimePicker setMinimumDate:startDate];
        [userTimePicker setMaximumDate:endDate];

        [userTimePicker setDate:startDate animated:YES];
        [userTimePicker reloadInputViews];

    }
}

Code which lets user selects his own time

-(void) userTimePickerValueChanged:(UIButton *)sender
{

    switch (self.selectedButton)
    {
        case 1:
        {
            NSUserDefaults *userSelectedMorningTime = [NSUserDefaults standardUserDefaults];

            NSDate *selectedMorningTime = [userTimePicker date];

            NSLog (@"SETTING: morningTimeKey");

            storedMornTime = selectedMorningTime;

            [userSelectedMorningTime setObject:selectedMorningTime forKey:@"morningTimeKey"];
            [userSelectedMorningTime synchronize];
        }
            break;

        case 2:
        {
            NSUserDefaults *userSelectedAfternoonTime = [NSUserDefaults standardUserDefaults];

            NSDate *selectedAfternoonTime = [userTimePicker date];

            NSLog (@"SETTING: afternoonTimeKey");

            storedAfternoonTime = selectedAfternoonTime;

            [userSelectedAfternoonTime setObject:selectedAfternoonTime forKey:@"afternoonTimeKey"];
            [userSelectedAfternoonTime synchronize];
        }
            break;
}

Upvotes: 1

Views: 3151

Answers (4)

jonypz
jonypz

Reputation: 1555

I had the same issue. For some reason setting the minimum date only for the date picker and not for the time picker solved my issue:

if ([datePicker isDatePicker]) {

    //DATE PICKER
    datePicker.minimumDate = [NSDate date];

}else{

    //TIME PICKER

    //datePicker.minimumDate = [NSDate date];

}

Upvotes: 0

Anupdas
Anupdas

Reputation: 10201

From what I could make out from the code you are saving the selected time to NSUserDefaults, but you are never using the saved time back from it.

My guess that if you change that everything should work.

-(IBAction)datepickerTimenButtonChanged:(UIButton *)control
{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    if (control.tag == 1)
    {
        self.selectedButton = control.tag;

        int startTime = 7;
        int endTime = 11;

        //Saved Morning time date from user defaults
        NSDate *date1  = [defaults objectForKey:@"morningTimeKey"];
        if(!date1) date1 = [NSDate date];
        components = [gregorian components: NSUIntegerMax fromDate: date1];

        [components setHour:startTime];;
        [components setMinute:00];

        NSDate *startDate = [gregorian dateFromComponents:components];

        [components setHour:endTime];
        [components setMinute:00];

        NSDate *endDate = [gregorian dateFromComponents:components];

        morningButton.selected = YES;
        afternoonButton.selected = NO;
        eveningButton.selected = NO;
        nightButton.selected = NO;

        [userTimePicker setDatePickerMode:UIDatePickerModeTime];

        [userTimePicker setMinimumDate:startDate];
        [userTimePicker setMaximumDate:endDate];

        [userTimePicker setDate:startDate animated:YES];
        [userTimePicker reloadInputViews];

    }

    if (control.tag == 2)
    {
        self.selectedButton = control.tag;

        morningButton.selected = NO;
        afternoonButton.selected = YES;
        eveningButton.selected = NO;
        nightButton.selected = NO;

        int startTime = 12;
        int endTime = 15;

        //Saved AfterNoon time date from user defaults
        NSDate *date1  = [defaults objectForKey:@"afternoonTimeKey"];
        if(!date1) date1 = [NSDate date];

        components = [gregorian components: NSUIntegerMax fromDate: date1];

        [components setHour:startTime];
        [components setMinute:00];

        NSDate *startDate = [gregorian dateFromComponents:components];

        [components setHour:endTime];
        [components setMinute:00];

        NSDate *endDate = [gregorian dateFromComponents:components];

        [userTimePicker setDatePickerMode:UIDatePickerModeTime];

        [userTimePicker setMinimumDate:startDate];
        [userTimePicker setMaximumDate:endDate];

        [userTimePicker setDate:startDate animated:YES];
        [userTimePicker reloadInputViews];

    }
}

Upvotes: 2

Dark Matter
Dark Matter

Reputation: 3698

Just save selected date in the variable. On showing dataPicker, just set that date.

NSDate * date = [NSDate date]
[datePicker setDate:date animated:YES];

Upvotes: 0

Divyam shukla
Divyam shukla

Reputation: 2046

[datePicker setDate:date animated:YES];

pass current date with

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

hope this will help you.

Upvotes: 1

Related Questions