2012-03-01 6 views
3

캘린더를 내 앱에서 사용하고 있습니다. (너무 많이 바뀌지는 않을 것입니다.) 캘린더의 사용자 선택에 따라 EKEvent 객체를 얻습니다.기존 EKEvent 편집 및 삭제 하시겠습니까?

어쨌든, 이미 존재하는 이벤트를 편집하고 삭제하려면 어떻게해야합니까? 즉 내가받는 EKEvent?

프로그래밍 방식으로이 작업을 수행해야합니다. Apple의 사전 제작 된 EKEventViewController를 사용하고 있지 않습니다.

새 이벤트를 성공적으로 생성하고 저장할 수 있지만 기존 이벤트를 편집하거나 삭제하는 방법을 잘 모르겠습니다. 감사합니다. 감사합니다.

답변

8

완전한 대답은 거의 데모 프로젝트가 필요합니다.

다른 접근 방식은 단순히 Event Kit Programming Guide에 대한 링크를 제공하는 것입니다.

코드 (이미 시도한 것)을 제공하지 않았으므로 나는이 응용 프로그램에서 추출한 것이 올바른 방향으로 사용자를 유도 할 것으로 기대합니다.

나는 앱의 특성으로 인해 EKEventViewController을 서브 라인으로 처리했음을 유의해야합니다. 이는 꼭 필요한 것은 아닙니다. 원래 EKEventViewController 은 검은 색으로 navigationBar으로 생성되지 않았기 때문에 단순히 서브 라이즈해야했습니다 (이것은 이미 버그로보고되었으며, 이미 으로 고정되어있는 경우에는 수정하지 않았습니다).

캘린더에 일정을 추가하는 방법을 알고 있으므로 EKEventStoreEKCalendar에 대한 참조를받을 필요가 없습니다.

일정에서 일정을 검색하는 방법에 대해서도 묻지 않으므로 이미 일정을 선택 (수신)하고 편집하려는 메커니즘이 있다고 가정 해 보겠습니다. 의 그것이라고하자

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

내가 appDelegate의 속성으로이 viewController을 만들 - 당신은 아마 더 나은 해결책을 가지고 있습니다. appDelegateeventStoredefaultCalendar 참조를 보유하고 있습니다. 귀하의 접근 방식은 다를 수 있습니다.

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 

#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 
MPEventEditViewController.m
: 이렇게되면

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는 (다시, 이것은이 켜지지 아니지만 유용 올 수도)

이 글을 쓰고 난 후에야 훌륭한 샘플 코드 SimpleEKDemo가 기억났습니다. 실제로이 게시 된 코드 중 일부는 아마 거기에서 비롯된 것입니다.

편집 : 질문을 편집 한 후

위의 대답은 오프 화제가되었다.

이 경우 및 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]; 

: 삭제하는 모든 이벤트는이 시도 참고 : 모든 이벤트를 삭제할 수 있다는 보장은 없습니다. y 이벤트는 에서 설정 앱의 usert가 설정 한 기본 캘린더입니다.

+0

답변 해 주셔서 감사합니다. 하지만 불행히도 내 문제는 (미안하다) 애플의 EKEventViewController를 사용하지 않고 이벤트를 편집해야하고, 모두 프로그래밍 방식으로 완료해야한다. –

+0

@JoshKahane : 아하, 완전히 다른 질문입니다. :)이 메시지를 확인하면 내 대답이 삭제됩니다. 그렇지 않으면 사람들은 주제에서 응답으로 나를 downvote 수도 있습니다 : –

+1

@ JoshKahane : 실제로 나는 대신 내 대답을 편집. :) 거의 모든 '재미있는'EKEvent의 속성은 거기에서 상속되기 때문에 EKCalendarItem을 살펴 보는 것을 잊지 마십시오. –