Добавление события в пользовательский календарь привело к сбою приложения

Я пытаюсь добавить событие в пользовательский календарь.

Чтобы получить список календарей, который я использовал ниже

EKEventStore *eventStore = [[EKEventStore alloc] init];
[eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
   if(!granted) {
     //error alert
     return;
   }
   NSArray *calendars = [eventStore calendarsForEntityType:EKEntityTypeEvent];
   // List of all calendars
   // Let user to choose a calendar.
}];

Для добавления события я использовал приведенный ниже код

-(void)addEvent:(EventStoreClass *)storeObject
{
    EKEventStore *store = [[EKEventStore alloc] init];

    [store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
        if (!granted) return;

        EKEvent *event = [EKEvent eventWithEventStore:store];
        [event setTitle:[storeObject eventTitle]];
        [event setStartDate:[storeObject eventStartDate]];
        [event setEndDate:[storeObject eventEndDate]];
        [event setCalendar:[storeObject calendar] ? [storeObject calendar] : [store defaultCalendarForNewEvents]];
        [store saveEvent:event span:EKSpanThisEvent commit:YES error:nil];
    }];
}

Теперь, когда я использовал календарь по умолчанию, он был успешно добавлен, но когда я выбираю любой другой календарь, приложение падает, и в журнале отображается

*** -[EKSource сохранить]: сообщение отправлено на освобожденный экземпляр 0x7f9bddb1bf50.

введите здесь описание изображения

Я не могу выяснить точную проблему или для какой линии эта проблема возникает. Любой совет будет ценен.


person Tapas Pal    schedule 26.05.2015    source источник
comment
Поскольку requestAccessToEntityType:completion: является асинхронным, возможно, вам придется определить store как свойство strong.   -  person Larme    schedule 26.05.2015
comment
Не работает, все равно вылетает так же....   -  person Tapas Pal    schedule 26.05.2015


Ответы (3)


Вы должны проверить, позволяет ли этот конкретный календарь изменять его или нет.

  if ([storeObject calendar].allowsContentModifications)
    {
      //add event now  
    }
person Aman_Neuron    schedule 26.05.2015
comment
это разрешено, но все равно разбилось. - person Tapas Pal; 26.05.2015
comment
вы включили NSZombie - person Aman_Neuron; 26.05.2015

Да. Ваш объект хранилища освобождается до того, как запустится блок завершения.

Самый простой способ это исправить - сохранить объект магазина как поле:

EKEventStore *store;

-(void)addEvent:(EventStoreClass *)storeObject
{
   store = [[EKEventStore alloc] init];

    [store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
        if (!granted) return;

        EKEvent *event = [EKEvent eventWithEventStore:store];
        [event setTitle:[storeObject eventTitle]];
        [event setStartDate:[storeObject eventStartDate]];
        [event setEndDate:[storeObject eventEndDate]];
        [event setCalendar:[storeObject calendar] ? [storeObject calendar] : [store defaultCalendarForNewEvents]];
        [store saveEvent:event span:EKSpanThisEvent commit:YES error:nil];
    }];
}
person oxigen    schedule 26.05.2015

Эта проблема была решена следующим образом.

-(void)addEvent:(EventStoreClass *)storeObject
{
    EKEventStore *store = [[EKEventStore alloc] init];

    [store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
        if (!granted) return;

        EKEvent *event = [EKEvent eventWithEventStore:store];
        [event setTitle:[storeObject eventTitle]];
        [event setStartDate:[storeObject eventStartDate]];
        [event setEndDate:[storeObject eventEndDate]];

        if([storeObject calendar]) {
            NSArray *calendars = [store calendarsForEntityType:EKEntityTypeEvent];
            __block EKCalendar *calendar;

            [calendars enumerateObjectsUsingBlock:^(EKCalendar *cal, NSUInteger idx, BOOL *stop) {
                if([[cal title] isEqualToString:[[storeObject calendar] title]]) {
                    calendar = cal;
                    *stop = YES;
                }
            }];

            [event setCalendar:calendar];
        }
        else {
            [event setCalendar:[store defaultCalendarForNewEvents]];
        }
        [store saveEvent:event span:EKSpanThisEvent commit:YES error:nil];
    }];
}

Проблема возникла [storeObject calendar], так как этот календарь был взят из другого магазина, и мы связываем его с другим магазином. Так что я просто взял календари из того же магазина, и это работает.

person Tapas Pal    schedule 27.05.2015