在iPhone应用程序中将事件添加到iCal中

时间:2011-04-16 05:50:13

标签: iphone objective-c

我的申请中有一项要求,即当我在某一天预约医生时,应在iCal中添加该日。并且应该在该特定日期生成警报视图。

所以,我没有得到如何在iCal中添加事件。请给我一些答案。

场景是,我确实有一个字符串(NSString)为“date”和“notes”,用于该特定约会。然后,如何将所有这些信息插入iCal。

代码:

- (NSArray *)fetchEventsForToday {

    NSDate *startDate = [NSDate date];

    // endDate is 1 day = 60*60*24 seconds = 86400 seconds from startDate
    NSDate *endDate = [NSDate dateWithTimeIntervalSinceNow:86400];

    // Create the predicate. Pass it the default calendar.
    NSArray *calendarArray = [NSArray arrayWithObject:defaultCalendar];
    NSPredicate *predicate = [self.eventStore predicateForEventsWithStartDate:startDate endDate:endDate 
                                                                    calendars:calendarArray]; 

    // Fetch all events that match the predicate.
    NSArray *events = [self.eventStore eventsMatchingPredicate:predicate];

    return events;
}


// Overriding EKEventEditViewDelegate method to update event store according to user actions.
- (void)eventEditViewController:(EKEventEditViewController *)controller 
          didCompleteWithAction:(EKEventEditViewAction)action {

    NSError *error = nil;
    EKEvent *thisEvent = controller.event;

    switch (action) {
        case EKEventEditViewActionCanceled:
            // Edit action canceled, do nothing. 
            break;

        case EKEventEditViewActionSaved:
            // When user hit "Done" button, save the newly created event to the event store, 
            // and reload table view.
            // If the new event is being added to the default calendar, then update its 
            // eventsList.
            if (self.defaultCalendar ==  thisEvent.calendar) {
                [self.eventsList addObject:thisEvent];
            }
            [controller.eventStore saveEvent:controller.event span:EKSpanThisEvent error:&error];
            [self.tableView reloadData];
            break;

        case EKEventEditViewActionDeleted:
            // When deleting an event, remove the event from the event store, 
            // and reload table view.
            // If deleting an event from the currenly default calendar, then update its 
            // eventsList.
            if (self.defaultCalendar ==  thisEvent.calendar) {
                [self.eventsList removeObject:thisEvent];
            }
            [controller.eventStore removeEvent:thisEvent span:EKSpanThisEvent error:&error];
            [self.tableView reloadData];
            break;

        default:
            break;
    }
    // Dismiss the modal view controller
    [controller dismissModalViewControllerAnimated:YES];

}

// Set the calendar edited by EKEventEditViewController to our chosen calendar - the default calendar.
- (EKCalendar *)eventEditViewControllerDefaultCalendarForNewEvents:(EKEventEditViewController *)controller 
{
    EKCalendar *calendarForEdit = self.defaultCalendar;
    return calendarForEdit;
}

我使用过这些函数和委托方法。请告诉我,当用户收到提醒提醒时,如何打开有关该事件的信息?

3 个答案:

答案 0 :(得分:2)

您需要EventKit framework。您可以向EKEventStore询问其日历,然后使用这些日历创建一个允许您find events that match the criteria you're looking for的谓词。或者,您可以创建新的EKEvent对象和save it into the event store

答案 1 :(得分:1)

这个链接。你可能会得到解决方案:)

Programmatically add custom event in the iPhone Calendar

答案 2 :(得分:1)

基于Apple文档,从iOS 6.0开始,这已经发生了一些变化。

1)您应该通过“requestAccessToEntityType:completion:”请求访问用户的日历,并在块内执行事件处理。

2)您需要立即提交您的活动或将“提交”参数传递给您的保存/删除电话

其他一切都保持不变......

将EventKit框架和#import添加到您的代码中。

添加活动:

   EKEventStore *store = [[EKEventStore alloc] init];
[store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
    if (!granted) { return; }
    EKEvent *event = [EKEvent eventWithEventStore:store];
    event.title = @"Event Title";
    event.startDate = [NSDate date]; //today
    event.endDate = [event.startDate dateByAddingTimeInterval:60*60];  //set 1 hour meeting
    [event setCalendar:[store defaultCalendarForNewEvents]];
    NSError *err = nil;
    [store saveEvent:event span:EKSpanThisEvent commit:YES error:&err];
    NSString *savedEventId = event.eventIdentifier;  //this is so you can access this event later
}];

删除活动:

    EKEventStore* store = [[EKEventStore alloc] init];
[store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
    if (!granted) { return; }
    EKEvent* eventToRemove = [store eventWithIdentifier:savedEventId];
    if (eventToRemove) {
        NSError* error = nil;
        [store removeEvent:eventToRemove span:EKSpanThisEvent commit:YES error:&error];
    }
}];
相关问题