ios - 以编程方式在 iPhone 日历中添加自定义事件

标签 ios iphone calendar eventkit

有什么方法可以从自定义应用程序向 iPhone 日历添加 iCal 事件吗?

最佳答案

基于 Apple Documentation ,从 iOS 6.0 开始,这发生了一些变化。

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

2) 您需要立即提交您的事件或将“提交”参数传递给您的保存/删除调用

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

添加 EventKit 框架和 #import <EventKit/EventKit.h>到你的代码。

在我的示例中,我有一个 NSString *savedEventId 实例属性。

添加事件:

    EKEventStore *store = [EKEventStore new];
    [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.calendar = [store defaultCalendarForNewEvents];
        NSError *err = nil;
        [store saveEvent:event span:EKSpanThisEvent commit:YES error:&err];
        self.savedEventId = event.eventIdentifier;  //save the event id if you want to access this later
    }];

删除事件:

    EKEventStore* store = [EKEventStore new];
    [store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
        if (!granted) { return; }
        EKEvent* eventToRemove = [store eventWithIdentifier:self.savedEventId];
        if (eventToRemove) {
            NSError* error = nil;
            [store removeEvent:eventToRemove span:EKSpanThisEvent commit:YES error:&error];
        }
    }];

这会将事件添加到您的默认日历中,如果您有多个日历,那么您将找出哪个是

Swift 版本

需要导入EventKit框架

import EventKit

添加事件

let store = EKEventStore()
store.requestAccessToEntityType(.Event) {(granted, error) in
    if !granted { return }
    var event = EKEvent(eventStore: store)
    event.title = "Event Title"
    event.startDate = NSDate() //today
    event.endDate = event.startDate.dateByAddingTimeInterval(60*60) //1 hour long meeting
    event.calendar = store.defaultCalendarForNewEvents
    do {
        try store.saveEvent(event, span: .ThisEvent, commit: true)
        self.savedEventId = event.eventIdentifier //save event id to access this particular event later
    } catch {
        // Display error to user
    }
}

删除事件

let store = EKEventStore()
store.requestAccessToEntityType(EKEntityTypeEvent) {(granted, error) in
    if !granted { return }
    let eventToRemove = store.eventWithIdentifier(self.savedEventId)
    if eventToRemove != nil {
        do {
            try store.removeEvent(eventToRemove, span: .ThisEvent, commit: true)
        } catch {
            // Display error to user
        }
    }
}

关于ios - 以编程方式在 iPhone 日历中添加自定义事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/246249/

相关文章:

ios - 如何获取共享照片流 ALAsset 的 ALAssetRepresentation?

objective-c - 无法将 IBOutlets 连接到 Storyboard

iphone - 两个 ModalViewController

iOS - 通用链接检测不适用于物理设备(每次都在模拟器上工作)

iphone - 是否可以在 iphone 中以编程方式将多个 pdf 文件组合成一个 pdf 文件?

iphone - 如何在NSCalender中设置事件?

C++ 日历问题

objective-c - 从 subview 添加 View 到父 View

iOS swift 3 : Comparing One all elements of Array in another array

node.js - 当 Google 日历事件更改时更新数据库