Как выбрать несколько дат в библиотеке TapKu? - PullRequest
2 голосов
/ 02 сентября 2011

Я хотел бы показать несколько выбранных дат в tapkilibrary .like выделите даты в период с 14 июня 2011 по 18aug2011 .

Ответы [ 2 ]

4 голосов
/ 15 февраля 2012
    -(NSArray*)calendarMonthView:(TKCalendarMonthView *)monthView marksFromDate:(NSDate *)startDate toDate:(NSDate *)lastDate{

NSLog(@"Date Selected is %@",date);
        //txtbdate.text=date;

    NSDateFormatter *timeFormat = [[[NSDateFormatter alloc] init] autorelease];
    NSTimeZone *gmt = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
    [timeFormat setDateFormat:@"yyyy-MM-dd"];
    [timeFormat setTimeZone:gmt];


    //[timeFormat setLocale:[NSLocale currentLocale]];
    //[timeFormat setTimeZone:[NSTimeZone localTimeZone]]; 
    NSString *theTime = [timeFormat stringFromDate:date];   
    NSLog(@"%@",theTime); 
    objappdel.strdate=theTime;

    [tkmonthView reload];
    AppointmentDetail *appointmentDetail=[[AppointmentDetail alloc]initWithNibName:@"AppointmentDetail" bundle:nil];
    [self.navigationController pushViewController:appointmentDetail animated:YES];
    [appointmentDetail release];
}

- (NSArray*)calendarMonthView:(TKCalendarMonthView *)monthView marksFromDate:(NSDate *)startDate toDate:(NSDate *)lastDate
{   
    NSMutableArray * data = [[NSMutableArray alloc] init];
    NSDateFormatter *dateForm = [[NSDateFormatter alloc] init];
    NSTimeZone *gmt = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
    [dateForm setDateFormat:@"yyyy-MM-dd"];
    [dateForm setTimeZone:gmt];
    NSDate *date ;


    for (int i=0; i<[objappdel.arrDate count]; i++)
    {
        NSString *time;
        time=[objappdel.arrDate objectAtIndex:i];
        //time=  [[[jobData valueForKey:@"Record"] objectAtIndex:i] valueForKey:@"JobStartDate"];
        //time = [[time componentsSeparatedByString:@" "] objectAtIndex:0];
        date = [dateForm dateFromString:time];
        [data addObject:[NSString stringWithFormat:@"%@",date]];
    }
    NSArray *copy = [data copy];
        NSInteger index = [copy count] - 1;
        for (id object in [copy reverseObjectEnumerator]) 
        {
            if ([data indexOfObject:object inRange:NSMakeRange(0, index)] != NSNotFound) 
            {
                [data removeObjectAtIndex:index];
            }
            index--;
        }

    NSLog(@"sorted dates are %@",copy);
    // Initialise empty marks array, this will be populated with TRUE/FALSE in order for each day a marker should be placed on.
    NSMutableArray *marks = [NSMutableArray array];

    // Initialise calendar to current type and set the timezone to never have daylight saving
    NSCalendar *cal = [NSCalendar currentCalendar];
    [cal setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];

    // Construct DateComponents based on startDate so the iterating date can be created.
    // Its massively important to do this assigning via the NSCalendar and NSDateComponents because of daylight saving has been removed 
    // with the timezone that was set above. If you just used "startDate" directly (ie, NSDate *date = startDate;) as the first 
    // iterating date then times would go up and down based on daylight savings.
    NSDateComponents *comp = [cal components:(NSYearCalendarUnit | NSMonthCalendarUnit |
                                              NSDayCalendarUnit | NSWeekdayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit) 
                                    fromDate:startDate];
    NSDate *d = [cal dateFromComponents:comp];

    // Init offset components to increment days in the loop by one each time
    NSDateComponents *offsetComponents = [[NSDateComponents alloc] init];
    [offsetComponents setDay:1];    


    // for each date between start date and end date check if they exist in the data array
    while (YES) {
        // Is the date beyond the last date? If so, exit the loop.
        // NSOrderedDescending = the left value is greater than the right
        if ([d compare:lastDate] == NSOrderedDescending) 
        {
            break;
        }

        // If the date is in the data array, add it to the marks array, else don't
        //NSLog(@"%@",[d description]);

        if ([data containsObject:[d description]]) {
            [marks addObject:[NSNumber numberWithBool:YES]];
        } else {
            [marks addObject:[NSNumber numberWithBool:NO]];
        }

        // Increment day using offset components (ie, 1 day in this instance)
        d = [cal dateByAddingComponents:offsetComponents toDate:d options:0];
    }

    [offsetComponents release];

    return [NSArray arrayWithArray:marks];
}

Используйте этот метод делегата.Он вернет NSArray дат, которые вы хотите выделить.

1 голос
/ 06 мая 2013

Вы можете сделать это, сначала введя даты в массив.код для этого:

 - (void)calendarMonthView:(TKCalendarMonthView *)monthView didSelectDate:(NSDate *)d {
NSLog(@"selected Date IS - %@",inDate);

[myArray addObject:d];

for (id entry in myArray)
{

    if (inDate == nil && outDate == nil)
    {
        inDate = d;
        outDate = d;
    }
    if ([d compare:inDate] == NSOrderedAscending)
    {
        inDate = d;
    }
    if ([d compare:outDate] == NSOrderedDescending)
    {
        outDate = d;
    }

    d = nil;
}

}

После этого вы должны использовать действие нажатия кнопки, с помощью которого вы можете выбрать даты между этими двумя датами.Код для этого:

 - (IBAction)goBtn:(id)sender
  {
NSLog(@"startDate is: %@",inDate);
NSLog(@"endDate is: %@",outDate);

[calendar reload];
inDate = nil;
outDate = nil;

}

}

Тогда в одном методе делегата вам просто нужно создать массив, содержащий все даты между этими двумя датами.Он будет вызван сразу после нажатия кнопки.Код для этого:

 - (NSArray*)calendarMonthView:(TKCalendarMonthView *)monthView marksFromDate:(NSDate *)startDate toDate:(NSDate *)lastDate {
//***********
NSMutableArray *tempData = [[NSMutableArray alloc] init];
NSDate *nextDate;
for ( nextDate = inDate ; [nextDate compare:outDate] < 0 ; nextDate = [nextDate addTimeInterval:24*60*60] ) {
    // use date
    NSLog(@"%@",nextDate);
    [tempData addObject:[NSString stringWithFormat:@"%@",nextDate]];
}
[tempData addObject:[NSString stringWithFormat:@"%@",outDate]];
//***********


NSMutableArray *marks = [NSMutableArray array];


NSCalendar *cal = [NSCalendar currentCalendar];
[cal setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];

NSDateComponents *comp = [cal components:(NSMonthCalendarUnit | NSMinuteCalendarUnit | NSYearCalendarUnit |
                                          NSDayCalendarUnit | NSWeekdayCalendarUnit | NSHourCalendarUnit | NSSecondCalendarUnit)
                                fromDate:startDate];
NSDate *d = [cal dateFromComponents:comp];

NSDateComponents *offsetComponents = [[NSDateComponents alloc] init];
[offsetComponents setDay:1];


while (YES) {
    if ([d compare:lastDate] == NSOrderedDescending) {
        break;
    }

    if ([tempData containsObject:[d description]]) {
        [marks addObject:[NSNumber numberWithBool:YES]];
    } else {
        [marks addObject:[NSNumber numberWithBool:NO]];
    }

    d = [cal dateByAddingComponents:offsetComponents toDate:d options:0];
}

return [NSArray arrayWithArray:marks];

}

Надеюсь, это помогло вам.Пожалуйста, дайте мне знать, если у вас возникнут какие-либо проблемы.

...