Search code examples
ioscore-datambcalendarkitios-libraryios-subclass

MBCalendarKit: Connecting CKCalendarDataSource to Core Data


I'm connecting MBCalendarKit with Core Data.

This is the code to build a dictionary of events:

for (Task *task in _taskArray)
{
    _event = [CKCalendarEvent eventWithTitle:[task valueForKey:@"title"] andDate:[task valueForKey:@"startDate"] andInfo:nil];
    [_eventsArray addObject:_event];
}
 // Moving events to Dictionary
[_calendarData setObject:_eventsArray forKey:_event.date];

When implementing the method CKCalendarDataSource the outcome is not the desired one. I get all the events in the array for every date in the calendar, as shown below.

- (NSArray *)calendarView:(CKCalendarView *)calendarView eventsForDate:(NSDate *)date {
   return _calendarData[_event.date];
}

enter image description here


Solution

  • Since CKCalendarDataSource is expecting a specific Dictionary format I had to iterate through eventsArray instead of just passing it to _calendarData.

    {
        "July 15, 2014" =     (
            "<CKCalendarEvent: 0x1123128e0>"
        );
        "July 16, 2014" =     (
            "<CKCalendarEvent: 0x11230fb10>",
            "<CKCalendarEvent: 0x11230ff00>"
    
        "July 18, 2014" =     (
            "<CKCalendarEvent: 0x11230d880>",
            "<CKCalendarEvent: 0x11230df30>"
        );
    }
    

    [eventsArray enumerateObjectsUsingBlock:^(id object, NSUInteger idx, BOOL *stop) {
    
        if ([_calendarData objectForKey:[[eventsArray objectAtIndex:idx]date]]) {
            // Dictionary already contains object with this date
    
            NSMutableArray *existingDate = [[NSMutableArray alloc]init];
            [existingDate addObjectsFromArray:[_calendarData objectForKey:[[eventsArray objectAtIndex:idx]date]]];
            [existingDate addObject:object];
    
            [_calendarData setObject:existingDate forKey:[[eventsArray objectAtIndex:idx]date]];
        }
    
        else {
            NSMutableArray *uniqueDate = [[NSMutableArray alloc]init];
            [uniqueDate addObject:object];
            [_calendarData setObject:uniqueDate forKey:[[eventsArray objectAtIndex:idx]date]];
        }
    }];