在Xcode iOS中向日历添加事件

14

你好

我有一段代码用于将事件添加到日历,但它似乎没有生效。

-(void)event
{
    EKEventStore *eventStore = [[EKEventStore alloc] init];

    EKEvent *event  = [EKEvent eventWithEventStore:eventStore];
    event.title     = @"Event";


    NSDateFormatter *tempFormatter = [[NSDateFormatter alloc]init];
    [tempFormatter setDateFormat:@"dd.MM.yyyy HH:mm"];


    NSString *dateandtime =[NSString stringWithFormat:@"%@%@%@",datestring,@" ",starttimestring];
    NSString *dateandtimeend =[NSString stringWithFormat:@"%@%@%@",datestring,@" ",endtimestring];



    event.startDate = [tempFormatter dateFromString:dateandtime];
    event.endDate = [tempFormatter dateFromString:dateandtimeend];


    [event addAlarm:[EKAlarm alarmWithRelativeOffset:60.0f * -60.0f * 24]];
    [event addAlarm:[EKAlarm alarmWithRelativeOffset:60.0f * -15.0f]];

    [event setCalendar:[eventStore defaultCalendarForNewEvents]];
    NSError *err;
    [eventStore saveEvent:event span:EKSpanThisEvent error:&err];
}

从XML中我得到的日期和时间格式如下:

日期字符串:28.10.2012

开始时间字符串:15:00


在保存之前,请确保您的“startDate”和“endDate”是有效日期。 - Maulik
当我NSlog日期和时间以及dateandtimeend时,它们的格式为28.10.2012 15:00,与日期格式相同。 - WildWorld
当我NSlog事件的startDate时,它是(null),格式为2012-10-28 13:00:00 +0000 ??? - WildWorld
2个回答

24

您是否在iOS 6模拟器或带有iOS 6的设备上? 如果是这样,您需要在保存项目之前要求用户允许使用事件存储。 基本上,如果您的事件存储对象上可用requestAccessToEntityType:completion:选择器,则调用该方法并提供一个代码块,在用户授予权限时执行该代码块,然后在该代码块中执行事件保存。

首先将EventKit框架添加到您的项目中,并不要忘记包含导入:

#import <EventKit/EventKit.h>

以下是我用过且有效的代码片段:

EKEventStore *eventStore = [[EKEventStore alloc] init];
if ([eventStore respondsToSelector:@selector(requestAccessToEntityType:completion:)])
{
    // the selector is available, so we must be on iOS 6 or newer
    [eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
        dispatch_async(dispatch_get_main_queue(), ^{
            if (error)
            {
                // display error message here
            }
            else if (!granted)
            {
                // display access denied error message here
            }
            else
            {
                // access granted
                // ***** do the important stuff here *****
            }
        });
    }];
}
else
{
    // this code runs in iOS 4 or iOS 5
    // ***** do the important stuff here *****
}

[eventStore release];

这里是我在这个主题上所做的博客文章:

http://www.dosomethinghere.com/2012/10/08/ios-6-calendar-and-address-book-issues/


谢谢 :) 现在它运行得很好。我一测试它在iPhone上就会尽快回复你。我有一个问题,代码末尾的else是干什么用的?我知道第一个if、else if和else,但最后一个不确定。 - WildWorld
我已经编辑了上面的代码,以进一步解释正在发生的事情。如果应用程序在iOS 4或5上运行,则else部分将运行,因为在这些操作系统版本中,该事件套件选择器将不存在,并且您仍然希望在该实例中完成重要的工作。 - BP.
当然,如果这个答案对你有用,你可以点击答案左边的勾号接受它。;D - BP.
非常感谢,但我需要添加什么来为我的事件设置警报声?如果可能的话,如何为事件添加自定义警报声? - lenhhoxung

2

1) 添加 Eventkit 框架和 #import <EventKit/EventKit.h>

2)

 -(void)syncWithCalendar {
    EKEventStore *store = [EKEventStore new];
    [store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
        if (!granted) { return; }
        EKEvent *event = [EKEvent eventWithEventStore:store];
        event.title = @"Event Title Testing"; //give event title you want
        event.startDate = [NSDate date];
        event.endDate = [event.startDate dateByAddingTimeInterval:60*60];
        event.calendar = [store defaultCalendarForNewEvents];
        NSError *err = nil;
        [store saveEvent:event span:EKSpanThisEvent commit:YES error:&err];
    }];
}

3) 调用函数

[self syncWithCalendar];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接