我在我的应用程序中使用 Kal 日历(希望不会发生太大变化),但我会从中获得一个 EKEvent 对象,具体取决于日历上的用户选择。
无论如何,如何编辑和删除已经存在的事件?即我收到的EKEvent?
我需要以编程方式完成这一切,我没有使用任何 Apple 的预制 EKEventViewController。
我可以成功创建和保存新事件,但我不确定如何编辑或删除现有事件,任何帮助将不胜感激,谢谢。
我在我的应用程序中使用 Kal 日历(希望不会发生太大变化),但我会从中获得一个 EKEvent 对象,具体取决于日历上的用户选择。
无论如何,如何编辑和删除已经存在的事件?即我收到的EKEvent?
我需要以编程方式完成这一切,我没有使用任何 Apple 的预制 EKEventViewController。
我可以成功创建和保存新事件,但我不确定如何编辑或删除现有事件,任何帮助将不胜感激,谢谢。
一个完整的答案几乎需要一个演示项目。
其他方法只是给您一个指向Event Kit Programming Guide的链接。
由于您没有提供任何代码(您已经尝试过),我希望这个来自工作应用程序的摘录能够将您推向正确的轨道。
请注意,EKEventViewController
由于应用程序的具体情况,我被贬低了 - 这不是必需的。我不得不对它进行子类化,因为原始文件EKEventViewController
没有生成黑色navigationBar
(这也被报告为一个错误,如果它已经修复,现在不要这样做)。
您知道如何将事件添加到日历,因此无需编写有关获取EKEventStore
和的引用EKCalendar
。
您也没有询问如何从日历中检索事件,因此假设您已经有某种机制来选择(接收)事件并且您想要编辑它。假设它是:
EKEvent *selectedEvent = (EKEvent *)[events objectAtIndex: selectedIndex];
我创建它viewController
作为一个属性appDelegate
- 你可能有更好的解决方案。appDelegate
也持有eventStore
和defaultCalendar
参考 - 你的方法可能会有所不同。
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。事实上,一些发布的代码可能来自那里。
编辑:
编辑问题后,上述答案变得离题。
在这种情况下,您应该查看EKCalendarItem和EKevent。
您可以以编程方式更改几乎所有属性(其中大部分都继承自EKCalendarItem
)。
例如,也许你分心了,因为hasNotes
它是只读的。那是因为hasNotes
是一种功能,而不是真正的财产。, ,等属性是完全可编辑的。notes
atendees
startDate
endDate
为了保存修改后的事件,您仍然可以使用:
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];
注意:不能保证您可以删除所有事件 - 仅来自用户在设置应用程序中设置的默认日历中的事件。