簡體   English   中英

編輯和刪除現有的EKEvent?

[英]Edit and Delete Existing EKEvent?

我在我的應用程序中使用Kal日歷,(希望這不會改變太多)但我從中得到一個EKEvent對象,具體取決於日歷上的用戶選擇。

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

我需要以編程方式完成所有操作,我沒有使用任何Apple預制的EKEventViewController。

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

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

其他方法只是為您提供Event Kit Programming Guide的鏈接。

由於你沒有提供任何代碼(你已經嘗試過的),我希望這個工作應用程序的摘錄能夠將你帶到正確的軌道。

請注意,由於應用程序的細節,我將EKEventViewController EKEventViewController為子 - 這不是必需的。 我不得不對它進行子類化,因為原始的EKEventViewController沒有產生黑色navigationBar (這也被報告為一個bug,如果它已經修復了,現在不要)。

您知道如何向日歷添加事件,因此無需撰寫有關獲取對EKEventStoreEKCalendar的引用的EKCalendar

您也沒有詢問如何從日歷中檢索事件,因此我們假設您已經有某種機制來選擇(接收)事件並且您想要編輯它。 讓我們說它是:

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繼承)。

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

注意:無法保證您能夠刪除所有事件 - 僅限默認日歷中由設置應用中的usert設置的事件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM