Search code examples
ioscalendarnsdatetapku

How to check NSDate against a date in TAPKU calendar


I am using core data to store objects for my project.There is a date field in the object .I want to check against the clicked date of the Tapku calendar component for iphone. The date on my object is in the format

2011-01-10 and it is a localized date .

How can i check the date against the date returned from the tapku calendar control.


Solution

  • Yes you can, here is what I did to make it work:

    on the method: (NSArray*)calendarMonthView:(TKCalendarMonthView *)monthView marksFromDate:(NSDate *)startDate toDate:(NSDate *)lastDate

    • Make the normal core data fetch to get an array of objects
    • Start checking every day from startDate to lastDate with the [NSArray indexesOfObjectsPassingTest:] method
    • For all that passes the test add and object to the marks array and add a dictionary with the tested day as key and the fetched objects as values

    WARNING: make sure you cast your NSDate objects to a no time and GMT:0 dates in order to make the day comparison to work (learned this the hard way...)

    Here is some code...

    self.marksArray = [NSMutableArray array];
    self.dataDictionary = [NSMutableDictionary dictionary];
    
    NSCalendar *cal = [NSCalendar currentCalendar];
    [cal setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
    
    NSDateComponents *comp = [cal components:(NSMonthCalendarUnit | NSMinuteCalendarUnit | NSYearCalendarUnit | NSDayCalendarUnit | NSWeekdayCalendarUnit | NSHourCalendarUnit | NSSecondCalendarUnit) fromDate:start];
    
    NSDate *ds = [cal dateFromComponents:comp];
    
    // Init offset components to increment days in the loop by one each time
    NSDateComponents *offsetComponents = [[NSDateComponents alloc] init];
    [offsetComponents setDay:1];
    
    
    while (YES) {
        // Is the date beyond the last date? If so, exit the loop.
        // NSOrderedDescending = the left value is greater than the right
        if ([ds compare:end] == NSOrderedDescending) {
            break;
        }
    
        NSIndexSet *indexes = [arrayWithObjectsFromCoreData indexesOfObjectsPassingTest:
                               ^BOOL (id el, NSUInteger i, BOOL *stop) {
                                   NSDate *upd = [(YOUR_ENTINY *)el updated];
    
                                   NSDate *day=[self midnightUTC:upd]; 
                                   if([ds isSameDay:day]){ 
                                       return TRUE;
                                   }
                                   return FALSE;
                               }];
    
    
    
        if (indexes.count>0) {
    
            [self.marksArray addObject:[NSNumber numberWithBool:YES]];
            [self.dataDictionary setObject:[wods objectsAtIndexes:indexes] forKey:ds];
    
    
        }else {
            //no wods in this date
            [self.dataArray addObject:[NSNumber numberWithBool:NO]];
        } 
    
        // Increment day using offset components (ie, 1 day in this instance)
        ds = [cal dateByAddingComponents:offsetComponents toDate:ds options:0];
    
    
    
    }
    [offsetComponents release];
    

    The midnightUTC method can be found here: http://www.voidasterisk.org/post/4209842795/how-to-calculate-nsdate-of-midnight-in-ios