• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 816
  • Last Modified:

Retrieving specific iOS Calendar events

I need to retrieve all iOS events, from all calendars, with a predefined location string of "Office", then write the result to the NSLog and a UITextView.

Here is my code thus far:

#import "ViewController.h"

@interface ViewController ()


@implementation ViewController

@synthesize eventStore = _eventStore;
@synthesize events     = _events;
@synthesize eventTextView;

- (void)viewDidLoad
    // Store a reference to the event store
    EKEventStore *eventStore = [[EKEventStore alloc] init];
    [eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
        // handle access here
        if (granted)
            NSLog (@"Access granted");
    self.eventStore = eventStore;
    // Define a range of event dates we want to display
    NSDate *startDate = [NSDate dateWithTimeIntervalSinceNow:(-1*60*60)]; // 1 hour in the past
    NSDate *endDate   = [NSDate dateWithTimeIntervalSinceNow:(60*60*24*365)]; // 1 year from now
    // Create a predicate to search all celndars with our date range
    NSPredicate *predicate = [self.eventStore predicateForEventsWithStartDate:startDate
    endDate:endDate calendars:nil];
    // Query the event store using the predicate.
    NSArray *results       = [self.eventStore eventsMatchingPredicate:predicate];
    //Convert the results to a mutable array and store so we can implement swipe to delete
    NSMutableArray *events = [[NSMutableArray alloc] initWithArray:results];
    self.events = events;

    // Load the events from the event store
    //[self reloadEvents:nil];
    [super viewDidLoad];

- (void)didReceiveMemoryWarning
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.

- (void) reloadEvents:(id)sender

- (IBAction)getEvents:(id)sender {
    int i;
    int eventCount;
    eventCount = [self.events count];
    for (i = 0; i < eventCount; i++){
        self.eventTextView.text = [[self.events objectAtIndex: i]title], [[self.events objectAtIndex: i]startDate], [[self.events objectAtIndex: i]endDate], [[self.events objectAtIndex: i]location];
        NSLog (@"Event Title: %@, Event Start Date: %@, Event End Date: %@, Event Location: %@",[[self.events objectAtIndex: i]title],
            [[self.events objectAtIndex: i]startDate],
            [[self.events objectAtIndex: i]endDate],
            [[self.events objectAtIndex: i]location]);

Also, l gather that you can subscribe to the event store for notifications / changes to the calendar/s? How would this work in the context of the above? I am assuming that this would take the place of the button action, especially if the application was set to enter the background?
1 Solution
If I remember correctly, and if I understand your question, this code should give you what you are looking for:

Return all calendars
NSArray *calList = [eventStore calendars];

Open in new window

Then you could slap that in a for loop and should be able to do a:

NSString *searchTitle = @"myTitle";
NSLog(@"Test Cal Event Thing: %@", [[calList objectAtIndex:index] searchTitle]);

Open in new window

Give that a shot.  Hope this helps!
Greg_ArdenAuthor Commented:
Thank you. I actually had a fresh look at this, and although what l implemented had a few additional features (NSDate formatting to NSString, converting the location string to all lowercase characters, in principal your suggestion is essentially what l implemented.
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

The 14th Annual Expert Award Winners

The results are in! Meet the top members of our 2017 Expert Awards. Congratulations to all who qualified!

Tackle projects and never again get stuck behind a technical roadblock.
Join Now