首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在类似日出的EventKit中修改EKParticipants (与会者)

在类似日出的EventKit中修改EKParticipants (与会者)
EN

Stack Overflow用户
提问于 2015-06-04 02:16:11
回答 2查看 4.2K关注 0票数 22

我的目标是向EKEvent添加一些被邀请者。我还研究过其他类似的问题,比如this one,但都认为以编程方式将EKParticipant添加到EKEvent中基本上是不可能的。我确实看到attendees属性是只读的,但我看到像Sunrise这样的其他服务在他们的移动应用程序中使用它。

我确信他们使用的系统至少部分集成了EventKit,因为他们从用户的iCal应用程序中拉入日历。例如,从添加的Exchange帐户发送的邀请也明显是由Exchange服务发送的,而不是Sunrise自己的invite (直接将事件发布到Exchange或将其发布到iCal)。

任何解决此限制的方法都将非常有帮助-也许是Exchange上的端点,可以调用它来添加/删除被邀请者?EventKit内部的变通方法?只要它不是苹果公司的私有API,我将非常乐意尝试它。

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-12 01:43:15

我想通了!

从本质上讲,必须进入从EKParticipant继承的EKAttendee类。为此,我使用NSClassFromString()方法创建了该类的泛型实例。

一旦有了与会者,就可以使用setValue:ForKey:函数设置属性。

最后,将EKAttendee实例编译成一个数组,并将其设置为EKEventattendees属性。

我在我的设备上使用Exchange帐户进行了测试,它就像一个魅力--发送邀请和一切!

下面的代码是我现在用来设置事件出席者的代码。我的示例是创建新事件,但对于现有事件,这可以非常简单地完成,只需复制EKEvent上的attendees列表,然后对其进行修改和重新设置。

代码语言:javascript
复制
//Create generic event info
EKEvent *event = [EKEvent eventWithEventStore:database];
event.title = @"TEST EVENT";
event.location = @"Test location";
event.notes = @"Example notes";
event.startDate = [NSDate date];
event.endDate = [[NSDate date] dateByAddingTimeInterval:(60 * 60)];
event.calendar = exchange;

//Do our super clever hack
NSMutableArray *attendees = [NSMutableArray new];
for (int i = 0; i < 5; i++) {

    //Initialize a EKAttendee object, which is not accessible and inherits from EKParticipant
    Class className = NSClassFromString(@"EKAttendee");
    id attendee = [className new];

    //Set the properties of this attendee using setValue:forKey:
    [attendee setValue:@"Invitee" forKey:@"firstName"];
    [attendee setValue:[NSString stringWithFormat:@"#%i", i + 1] forKey:@"lastName"];
    [attendee setValue:@"test@email.com" forKey:@"emailAddress"];

    //Add this attendee to a list so we can assign it to the event
    [attendees addObject:attendee];
}

//Finally, add the invitees to the event
[event setValue:attendees forKey:@"attendees"];

//Save the event!
NSError *error = nil;
[database saveEvent:event span:EKSpanThisEvent error:&error];
if (error) {
    NSLog(@"Save failed with error: %@", error);
} else {
    NSLog(@"Success!");
}
票数 15
EN

Stack Overflow用户

发布于 2016-03-25 00:42:14

Swift版的rebello95解决方案。我可以肯定它的效果非常棒!我尝试过firstNamelastName属性,但它们似乎无关紧要,所以我在示例中省略了它们。重要的是emailAddress,它与你的联系人列表相匹配,在本地日历应用程序中显示全名。

代码语言:javascript
复制
private func createEventWithAttendees() {
    let eventStore = EKEventStore()

    let calendars = eventStore.calendarsForEntityType(.Event)

    let event = EKEvent(eventStore: eventStore)
    event.title = "TEST EVENT"
    event.startDate = NSDate()
    event.endDate = NSDate().dateByAddingTimeInterval(60 * 60)
    event.calendar = calendars[0]

    var attendees = [EKParticipant]()
    for i in 0 ..< 5 {
        if let attendee = createParticipant(email: "test\(i)@email.com") {
            attendees.append(attendee)
        }
    }
    event.setValue(attendees, forKey: "attendees")

    try! eventStore.saveEvent(event, span: .ThisEvent)
}

private func createParticipant(email email: String) -> EKParticipant? {
    let clazz: AnyClass? = NSClassFromString("EKAttendee")
    if let type = clazz as? NSObject.Type {
        let attendee = type.init()
        attendee.setValue(email, forKey: "emailAddress")
        return attendee as? EKParticipant
    }
    return nil
}
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30627694

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档