iphone - 编辑和删除现有的 EKEvent?

标签 iphone objective-c cocoa-touch ipad eventkit

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

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

我需要以编程方式完成这一切,我没有使用任何 Apple 的预制 EKEventViewController。

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

最佳答案

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

其他方法只是给你一个指向 Event Kit Programming Guide 的链接.

由于您没有提供任何代码(您已经尝试过的代码),我希望从一个可用的应用程序中摘录的这段代码能将您推向正确的轨道。

请注意,由于应用程序的具体情况,我对 EKEventViewController 进行了分类 - 这不是必需的。我不得不继承它只是因为原始的 EKEventViewController 没有生成黑色 navigationBar(这也被报告为一个错误,如果它是 已经修复了)。

您知道如何将事件添加到日历,因此无需编写有关获取对 EKEventStoreEKCalendar 的引用的文章。

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

EKEvent *selectedEvent = (EKEvent *)[events objectAtIndex: selectedIndex];

我将此 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];

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

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

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

编辑:

问题被编辑后,上面的答案就跑题了。

在那种情况下,你应该看看 EKCalendarItemEKevent .

您可以通过编程方式更改几乎所有属性(其中大部分是从 EKCalendarItem 继承的)。

也许您分心了,例如因为 hasNotes 是只读的。这是因为 hasNotes 是一种函数,而不是真正的属性属性,如notesattendeesstartDateendDate 等都是完全可编辑的。

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

 NSError error = nil;
 [self.eventStore saveEvent:event span: EKSpanFutureEvents error:&error];

删除它:

 NSError error = nil;
 [self.eventStore removeEvent:event span: EKSpanFutureEvents error:&error];

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];

注意:不能保证您能够删除所有事件 - 只能删除来自 由用户在设置应用程序中设置的默认日历。

关于iphone - 编辑和删除现有的 EKEvent?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9523895/

相关文章:

iphone - Iphone SDK 中 map 的详细 View

ios - UIPageViewController 与多个 UIViewController 与标题和底栏

ios - 运行时错误 -- 线程 1 : Signal SIGABRT -- No Console Output

iphone - 为 iPhone 编译 OpenSSH?

ios - 我想创建自定义表格 View 分隔符,UIlabel 位于两个表格 View 单元格之间,就像 iOS 的日历应用程序

objective-c - 游戏套件(GKSession): Is there a priority order when GKSession decides to use Wifi or Bluetooth (if both are available)

ios - 无法找到有关 UIDeviceRGBColorSpace 的文档

ios - NSOperationQueue : Trouble understanding the order

objective-c - 具有自定义裁剪矩形的 ImagePicker 库?

.net - Apple 会将 Mono Touch 运行时与每部 iPhone 捆绑在一起吗?