编辑和删除现有的EKEvent?

Jos*_*ane 3 iphone cocoa-touch objective-c ipad eventkit

我在我的应用程序中使用Kal日历,(希望这不会改变太多)但我从中得到一个EKEvent对象,具体取决于日历上的用户选择.

无论如何,我如何编辑和删除已经存在的事件?即我收到的EKEvent?

我需要以编程方式完成所有操作,我没有使用任何Apple预制的EKEventViewController.

我可以成功创建和保存新事件,但我不确定如何编辑或删除现有的事件,任何帮助将不胜感激,谢谢.

Rok*_*arc 8

完整的答案几乎需要一个演示项目.

其他方法只是为您提供Event Kit Programming Guide的链接.

由于你没有提供任何代码(你已经尝试过的),我希望这个工作应用程序的摘录能够将你带到正确的轨道.

请注意,EKEventViewController由于应用程序的具体细节,我进行了细分- 这不是必需的.我只好简单地sublass,因为原来EKEventViewController 没有用黑色产卵navigationBar(这也被报告为一个bug,现在不,如果它已经固定).

你知道如何添加一个事件日历,所以没有必要写关于得到参考EKEventStoreEKCalendar.

您也没有询问如何从日历中检索事件,因此我们假设您已经有某种机制来选择(接收)事件并且您想要编辑它.让我们说它是:

EKEvent *selectedEvent = (EKEvent *)[events objectAtIndex: selectedIndex];
Run Code Online (Sandbox Code Playgroud)

我创建这个viewController属性appDelegate- 你可能有更好的解决方案.appDelegate也持有eventStoredefaultCalendar参考 - 你的方法可能不同.

appDelegate.detailViewController = [[MPEventViewController alloc] initWithNibName:nil bundle:nil];  
appDelegate.detailViewController.event = selectedEvent;
appDelegate.detailViewController.eventStore = appDelegate.eventStore;   
appDelegate.detailViewController.defaultCalendar = appDelegate.defaultCalendar; 
appDelegate.detailViewController.allowsEditing = NO;
[appDelegate.navigationController pushViewController:appDelegate.detailViewController animated:YES];
Run Code Online (Sandbox Code Playgroud)

Sublcassing(再次,这不是必要的,但它可能会有用)像这样:

MPEventEditViewController.h

#import <Foundation/Foundation.h>
#import <EventKitUI/EventKitUI.h>

@interface MPEventViewController : EKEventViewController <EKEventEditViewDelegate> 

@property (nonatomic, strong) EKEventStore *eventStore;
@property (nonatomic, strong) EKCalendar *defaultCalendar;

- (void)editEvent:(id)sender;

@end
Run Code Online (Sandbox Code Playgroud)

MPEventEditViewController.m

#import "MPEventViewController.h"
#import "----------AppDelegate.h"

@implementation MPEventViewController

@synthesize eventStore;
@synthesize defaultCalendar; 

- (void)viewDidLoad {

    [super viewDidLoad];    
    [self setTitle: [self.event title]];
    self.allowsEditing = NO;
    self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:
                                               UIBarButtonSystemItemEdit target:self action:@selector(editEvent:)];

    //this has nothing to do with the answer :)
    //[[self.navigationController navigationBar] setTintColor: [UIColor colorWithHexString: NAVBAR_TINT_COLOR]]; 
}

- (void)editEvent:(id)sender {

    EKEventEditViewController *addController = [[EKEventEditViewController alloc] initWithNibName:nil bundle:nil];

    //this has nothing to do with the answer :)
    //[addController.navigationBar setTintColor: [UIColor colorWithHexString: NAVBAR_TINT_COLOR]]; 
    addController.eventStore = self.eventStore;
    addController.event = self.event;
    addController.navigationBar.barStyle = UIBarStyleBlack;
    addController.editViewDelegate = self;

    [self presentModalViewController:addController animated:YES];

}

- (void)eventEditViewController:(EKEventEditViewController *)controller 
          didCompleteWithAction:(EKEventEditViewAction)action {

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

    switch (action) {
        case EKEventEditViewActionCanceled:
            break;

        case EKEventEditViewActionSaved:
            [controller.eventStore saveEvent:controller.event span: EKSpanFutureEvents error:&error];
            break;

        case EKEventEditViewActionDeleted:

            [controller.eventStore removeEvent:thisEvent span: EKSpanFutureEvents error:&error];
            break;

        default:
            break;
    }

    //here would be the place to reload data if you hold it in some kind of UITableView    
    [controller dismissModalViewControllerAnimated:YES];
}


- (EKCalendar *)eventEditViewControllerDefaultCalendarForNewEvents:(EKEventEditViewController *)controller {
    EKCalendar *calendarForEdit = self.defaultCalendar;
    return calendarForEdit;
}

- (void)dealloc {

    eventStore = nil;
    defaultCalendar = nil;    
}

@end
Run Code Online (Sandbox Code Playgroud)

只有在写完所有这些后我才记得有一个很棒的示例代码SimpleEKDemo.事实上,这些发布的代码中的一些可能源自那里.

编辑:

问题编辑完成后,上述答案变得偏离主题.

在这种情况下,您应该看看EKCalendarItemEKevent.

您可以以编程方式更改所有属性(大多数属性都是从中继承的EKCalendarItem).

也许你分心了,例如hasNotes因为只读.这是因为hasNotes是样的的功能,而不是一个真正的财产.属性一样notes,atendees,startDate,endDate等是完全可编辑的.

要保存修改过的事件,您仍然可以使用:

 NSError error = nil;
 [self.eventStore saveEvent:event span: EKSpanFutureEvents error:&error];
Run Code Online (Sandbox Code Playgroud)

并删除它:

 NSError error = nil;
 [self.eventStore removeEvent:event span: EKSpanFutureEvents error:&error];
Run Code Online (Sandbox Code Playgroud)

EDIT2:删除所有事件试试这个:

//assuming self.eventStore is already properly set in code

//identifierArray would be your NSMutableArray holding event identifiers
//change the name according to your code

NSError error = nil;

for (NSString *eventIdentifier in removeAllObjects) {

    EKEvent *event = [self.eventStore eventWithIdentifier:eventIdentifier];

    [self.eventStore removeEvent:event span:EKSpanFutureEvents error:&error];
}

//now you can also clear identifiers
[removeAllObjects removeAllObjects];
Run Code Online (Sandbox Code Playgroud)

注意:无法保证您能够删除所有事件 - 仅限默认日历中由设置应用中的usert设置的事件.