Редактировать и удалять существующие EKEvent? - PullRequest
3 голосов
/ 02 марта 2012

Я использую календарь Kal в своем приложении (надеюсь, это не сильно изменится), но я получаю объект EKEvent в зависимости от выбора пользователя в календаре.

В любом случае, как можноЯ редактирую и удаляю событие, которое уже существует?А именно EKEvent, которое я получаю?

Мне нужно сделать все это программно, я не использую какой-либо из готовых EKEventViewController от Apple.

Я могу успешно создавать и сохранять новые события, но я не могуне знаете, как редактировать или удалять существующие, любая помощь будет оценена, спасибо.

1 Ответ

8 голосов
/ 02 марта 2012

Для полного ответа почти потребуется демонстрационный проект.

Другой подход - просто дать вам ссылку на Руководство по программированию Event Kit .

Поскольку вы этого не сделалиукажите любой код (что вы уже пробовали) я надеюсь, что этот фрагмент из рабочего приложения подтолкнет вас на правильный путь.

Обратите внимание, что я подкласс 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];

Субкассинг (опять же, это не обязательно, но может оказаться полезным) выглядит так:

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

Примечание: нет никаких гарантий, что вы будетевозможность удалить все события - только события из календаря по умолчанию, который устанавливается пользователем в приложении настроек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...