У меня есть приложение, где я хочу запланировать некоторые события. Поэтому я хочу создать новый календарь для своего приложения, если он еще не существует, и если он ссылается на это при добавлении новых событий.
Как создать новый EKCalendar на устройстве iOS?
Ответ 1
Вот как это делается на iOS 5 с помощью рамки EventKit
:
Прежде всего вам нужен объект EKEventStore
для доступа ко всем:
EKEventStore *store = [[EKEventStore alloc] init];
Теперь вам нужно найти источник локального календаря, если вы хотите, чтобы календарь хранился локально. Существуют также источники для обмена счетами, CALDAV, MobileMe и т.д.:
// find local source
EKSource *localSource = nil;
for (EKSource *source in store.sources)
if (source.sourceType == EKSourceTypeLocal)
{
localSource = source;
break;
}
Теперь вот часть, в которой вы можете получить свой ранее созданный календарь. Когда календарь создан (см. Ниже), есть идентификатор. Этот идентификатор должен быть сохранен после создания календаря, чтобы ваше приложение снова могло идентифицировать календарь. В этом примере я просто сохранил идентификатор в константе:
NSString *identifier = @"E187D61E-D5B1-4A92-ADE0-6FC2B3AF424F";
Теперь, если у вас еще нет идентификатора, вам нужно создать календарь:
EKCalendar *cal;
if (identifier == nil)
{
cal = [EKCalendar calendarWithEventStore:store];
cal.title = @"Demo calendar";
cal.source = localSource;
[store saveCalendar:cal commit:YES error:nil];
NSLog(@"cal id = %@", cal.calendarIdentifier);
}
Вы также можете настроить такие свойства, как цвет календаря и т.д. Важной частью является сохранение идентификатора для последующего использования. С другой стороны, если у вас уже есть идентификатор, вы можете просто выбрать календарь:
else
{
cal = [store calendarWithIdentifier:identifier];
}
Я также добавил некоторые результаты отладки:
NSLog(@"%@", cal);
Теперь у вас в любом случае есть объект EKCalendar
для дальнейшего использования.
EDIT: По состоянию на iOS 6 calendarWithEventStore
обесценивается, используйте:
cal = [EKCalendar calendarForEntityType:<#(EKEntityType)#> eventStore:<#(EKEventStore *)#>];