Для полного ответа почти потребуется демонстрационный проект.
Другой подход - просто дать вам ссылку на Руководство по программированию 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];
Примечание: нет никаких гарантий, что вы будетевозможность удалить все события - только события из календаря по умолчанию, который устанавливается пользователем в приложении настроек.