【问题标题】:Edit and Delete Existing EKEvent?编辑和删除现有的 EKEvent?
【发布时间】:2012-03-01 20:53:04
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: iphone objective-c cocoa-touch ipad eventkit


    【解决方案1】:

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

    其他方法只是给您一个指向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];
    

    Sublcasing(同样,这不是必需的,但它可能会很有用)是这样的:

    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 是一种函数,而不是真正的属性属性notesatendeesstartDateendDate等都是完全可编辑的。

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

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

    注意:不能保证您可以删除所有事件 - 仅来自 用户在设置应用中设置的默认日历。

    【讨论】:

    • 感谢您的回答!但不幸的是,我的问题是(应该说,对不起)我需要在不使用 Apple 的 EKEventViewController 的情况下编辑事件,并以编程方式完成。
    • @JoshKahane:啊哈,这是完全不同的问题 :) 当您确认看到此消息时,我将删除我的答案。否则人们可能会否决我回答的话题:)
    • @JoshKahane:实际上我编辑了我的答案。 :) 不要忘记查看 EKCalendarItem,因为几乎所有“有趣”的 EKEvent 属性都是从那里继承的。
    • 如何删除所有事件?我将 EventIdentifire 存储在一个数组中,我必须删除所有事件。
    • @iphonedev23:我将此添加到 EDIT2。我现在在 win 电脑上,所以我无法测试这段代码,但它应该可以工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-21
    • 1970-01-01
    • 2014-11-08
    • 2011-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多