iPhone Event Kit: программно создать EKCalendar?
Я хотел бы вставить события в свое приложение, чтобы их можно было просмотреть в iPhone Calendar.app. Но так как я не хочу смешивать пользовательские события с событиями из моего приложения, я хотел создать EKCalendar, такой как "MyApp Events"
Это возможно? Как бы вы отфильтровали ваши события в противном случае?
Спасибо!
3 ответа
Абсолютно возможно создать свой собственный календарь - главное, что вам нужна iOS 5:
EKEventStore* eventStore = [[EKEventStore alloc] init];
NSString* calendarName = @"My Cal";
EKCalendar* calendar;
// Get the calendar source
EKSource* localSource;
for (EKSource* source in eventStore.sources) {
if (source.sourceType == EKSourceTypeLocal)
{
localSource = source;
break;
}
}
if (!localSource)
return;
calendar = [EKCalendar calendarWithEventStore:eventStore];
calendar.source = localSource;
calendar.title = calendarName;
NSError* error;
bool success= [eventStore saveCalendar:calendar commit:YES error:&error];
if (error != nil)
{
NSLog(error.description);
// TODO: error handling here
}
Есть ли у вас (или кого-либо еще) какой-либо прогресс в добавлении нового Календаря?
У меня такая же ситуация. Я могу программно добавлять события в календарь по умолчанию на отлично, но я бы хотел добавить их в новый календарь, чтобы они не мешали существующим событиям пользователей и могут быть легко удалены / скрыты пользователем вместо удаления все события вручную.
Вы не можете установить свойства для нового объекта EKCalendar. Похоже, что вы можете назначить только один из них, например defaultCalendarForNewEvents, объекту EKCalendar.
Тем не менее, я знаю, что можно программно создать новый календарь, потому что я видел, как это делает приложение для iPhone (не выходя из приложения).
- Может ли быть так, что они используют обходной путь, выполняя какой-то трюк с внешним файлом ICS?
- Возможно, это можно сделать, "подписавшись" на локальный (в файловой системе iPhone/ приложения) файл ICS, а не на URL. У кого-нибудь есть опыт с этим?
Вот как вы можете проверить, существует ли уже календарь с определенным названием. Если его не существует, вы можете создать его программно.
Объявите переменную логического типа
BOOL doesExist=NO;
EKEventStore *eventStore=[[EKEventStore alloc] init];
NSArray *calanders=[eventStore calendarsForEntityType:EKEntityTypeEvent];
//Now Iterate through every calendar in the array and match its title
// with the title that you want to create
for(EKCalendar calendar in calendars)
{
if([[calendar title] isEqualToString:@"youdesiredname"])
{
doesExist=YES;
}
}
// так что теперь проверьте, содержит ли наша переменная bool значение YES, это означает, что календарь с таким именем / заголовком уже существует. Если нет, то вы можете создать
if(!doesExist)
{
NSString* calendarName = @"DesiredCalendarName";
EKCalendar* calendar;
EKSource* localSource;
for (EKSource* source in eventStore.sources) {
if (source.sourceType == EKSourceTypeLocal)
{
localSource = source;
break;
}
if (!localSource)
return;
calendar = [EKCalendar calendarWithEventStore:eventStore];
calendar.source = localSource;
calendar.title = calendarName;
EKEvent *event = [EKEvent eventWithEventStore:eventStore];
calendar = [eventStore calendarWithIdentifier:self.calendarIdentifier];
event.calendar = calendar;
// Set the start date to the current date/time and the event duration to one hour
NSDate *startDate = [NSDate date];
event.startDate = startDate;
event.endDate = [startDate dateByAddingTimeInterval:3600];
//And to save the event to the event database:
NSError *error = nil;
BOOL result = [eventStore saveEvent:event span:EKSpanThisEvent commit:YES error:&error];
if (result)
{
NSLog(@"Saved event to event store.")
}
else
{
NSLog(@"Error saving event: %@.", saveError);
}
NSError* error;
bool success= [eventStore saveCalendar:calendar commit:YES error:&error];
if (error != nil)
{
NSLog(error.description);
}
}