2012-03-01 68 views
3

我在我的應用程序中使用了Kal日曆(希望這不會改變太多),但是根據日曆上的用戶選擇,我得到一個EKEvent對象。編輯和刪除現有的EKEvent?

無論如何,我如何編輯和刪除已存在的事件?即我收到的EKEvent?

我需要以編程方式完成這一切,我沒有使用任何Apple預先製作的EKEventViewController。

我可以成功創建和保存新事件,但林不知道如何編輯或刪除現有的,任何幫助,將不勝感激,謝謝。

回答

8

一個完整的答案几乎需要一個演示項目。

其他方法只是簡單地給你一個鏈接Event Kit Programming Guide

由於您沒有提供任何代碼(您已經嘗試過)我希望這個來自工作應用程序的提取將推動您走向正確的軌道。

請注意,我sublassed 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

你可以改變編程的allmost所有屬性(大部分都是從EKCalendarItem繼承)。

也許你分心例如becaues 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]; 

注意:不能保證您能夠刪除所有事件 - onl y事件 默認日曆,由​​設置應用程序中的usert設置。

+0

謝謝您的回答!但不幸的是,我的問題是(應該說,對不起)是我需要編輯事件,而不使用Apple的EKEventViewController,並以編程方式完成。 – 2012-03-02 17:19:57

+0

@JoshKahane:哈哈,這是完全不同的問題:)我會刪除我的答案,當你確認看到這條消息。否則,人們可能會低估我作爲回答主題:) – 2012-03-02 17:31:34

+1

@JoshKahane:實際上,我編輯我的答案,而不是。 :)不要忘記看看EKCalendarItem,因爲幾乎所有'有趣的'EKEvent的屬性都從那裏繼承。 – 2012-03-02 17:46:54