1

I have a picker view similar to the alarm clock app on the iphone (first component = 1-12, second component = 0-60, third component = am/pm). What I do is this in the didSelect delegate of the picker view.

if (component == PICKER_HOURS) {
        rowSelected = [self.hour objectAtIndex:row % 12];
        self.hourSelected = rowSelected;
    }
    else if (component == PICKER_MINUTES) {
        rowSelected = [self.minutes objectAtIndex:row % 60];
        self.minuteSelected = rowSelected;
    }
    else {
        rowSelected = [self.ampm objectAtIndex:row];
        self.ampmSelected = rowSelected;
    }
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setTimeZone:[NSTimeZone systemTimeZone]];
    dateFormatter.dateFormat = @"h:mm a";

    NSString *timeString = [NSString stringWithFormat:@"%@:%@ %@", _hourSelected, _minuteSelected, _ampmSelected];
    NSString *trimmedTimeString = [timeString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];

    NSDate *dateSelected = [dateFormatter dateFromString:timeString];

    NSDate *dateForAlarm = [self alarmDateForDate:dateSelected];


------


- (NSDate *)alarmDateForDate:(NSDate *)dateSelected {
    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDateComponents *dateComponents = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit)
                                                   fromDate:[NSDate date]];     // set the date to the current date
    NSDateComponents *timeComponents = [calendar components:(NSHourCalendarUnit | NSMinuteCalendarUnit) fromDate:dateSelected];     // set the time to what's in the picker

    NSDateComponents *dateComps = [[NSDateComponents alloc] init];
    [dateComps setDay:[dateComponents day]];
    [dateComps setYear:[dateComponents year]];
    [dateComps setMonth:[dateComponents month]];
    [dateComps setHour:[timeComponents hour]];
    [dateComps setMinute:[timeComponents minute]];

    NSDate *dateForAlarm = [calendar dateFromComponents:dateComps];

    return dateForAlarm;
}

Is this the right approach? I realized that my dateFromString in the picker view is always the 1970 time. So I wasn't sure if this was 'standard' way to get the time from a picker view so that it is in the future to set a notification. Thanks!

Nimit Parekh
  • 16,776
  • 8
  • 50
  • 72
Crystal
  • 28,460
  • 62
  • 219
  • 393

1 Answers1

0

Look at this -

Date Picker :-

m_pDatePicker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, 40, 50, 50)];
    m_pDatePicker.datePickerMode = UIDatePickerModeDate;
    NSDate *minDate = [NSDate new];
    [m_pDatePicker setMinimumDate:minDate];

    m_pDatePicker.hidden = NO;
    [m_pClientView addSubview:m_pDatePicker];

    [m_pDatePicker addTarget:self action:@selector(pickDateLabel)forControlEvents:UIControlEventValueChanged];

    NSDateComponents* comps = [m_pDatePicker.calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit)
                                                        fromDate:m_pDatePicker.date];
    int myDay = [comps day];
    int myMonth = [comps month];
    int myYear = [comps year];

    pickDateLabel.text=[NSString stringWithFormat:@"%d/%d/%d",myMonth,myDay,myYear];

    dueDateLabel.text=[NSString stringWithFormat:@"%d/%d/%d",myDay,myMonth,myYear];

    [m_pDatePicker release];
    [minDate release];

}

Picking Date -

- (void)pickDateLabel
{

    NSDateComponents* comps = [m_pDatePicker.calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit)
                                                        fromDate:m_pDatePicker.date];
    int myDay = [comps day];
    int myMonth = [comps month];
    int myYear = [comps year];

    pickDateLabel.text=[NSString stringWithFormat:@"%d/%d/%d",myMonth,myDay,myYear];    

    dueDateLabel.text=[NSString stringWithFormat:@"%d/%d/%d",myDay,myMonth,myYear];


}

Hope it helps !!

Akshay
  • 2,973
  • 6
  • 43
  • 75