Удаление события с помощью Event Kit в iPhone

Я использую Event Kit в своем приложении для iOS и создаю событие с помощью Event Kit. Я могу создать его, но я также хочу дать возможность удалить. Но я не могу этого сделать. Я знаю, что у EKEventStore есть способ удалить событие, но я не могу создать объект события. У меня есть идентификатор события в виде строки, но я не могу создать с его помощью объект события. Может кто-нибудь, пожалуйста, помогите мне сделать это?

С уважением Панкай


person pankaj    schedule 17.08.2012    source источник
comment
Вы говорите, что у вас есть идентификатор события, пытались ли вы получить событие с помощью eventWithIdentifier: для EKEventStore?   -  person rckoenes    schedule 17.08.2012


Ответы (3)


Когда вы создаете событие, сохраняйте его идентификатор следующим образом:

NSString* str = [[NSString alloc] initWithFormat:@"%@", event.eventIdentifier];

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

EKEventStore* store = [[EKEventStore alloc] init];
    EKEvent* event2 = [store eventWithIdentifier:str];
    if (event2 != nil) {  
        NSError* error = nil;
        [store removeEvent:event2 span:EKSpanThisEvent error:&error];
    } 
person Sonu    schedule 17.08.2012
comment
Я сделал то же самое на iOS 5/6, но не работает. eventWithIdentifier возвращает значение null. Идентификатор совпадает на 100%. В чем проблема? - person Borut Tomazin; 10.10.2012
comment
Я обнаружил, что event.eventIdentifier всегда равен нулю, вместо этого я использую event.calendarItemIdentifier. И получил событие от (EKEvent *)[eventStore calendarItemWithIdentifier:current_calendarItemIdentifier]; - person Zy Zhao; 01.02.2016

См. это как event.eventIdentifier меняет значение. Таким образом, вы должны отслеживать event.title, который вы установили для события, и получить доступ к событию и удалить его.

NSDate *startDate = <EVENT_START_DATE>;
NSDate *endDate = <EVENT_END_DATE>;

NSPredicate *predicateForEvents = [eventStore predicateForEventsWithStartDate:startDate endDate:endDate calendars:[NSArray arrayWithObject:[eventStore defaultCalendarForNewEvents]]];
//set predicate to search for an event of the calendar(you can set the startdate, enddate and check in the calendars other than the default Calendar)

NSArray *events_Array = [eventStore eventsMatchingPredicate: predicateForEvents];                        
//get array of events from the eventStore

for (EKEvent *eventToCheck in events_Array) 
{
    if( [eventToCheck.title isEqualToString: @"yourEventTitle"] ) 
    {
         NSError *err;
         BOOL success = [eventStore removeEvent:eventToCheck span:EKSpanThisEvent error:&err];
         NSLog( @"event deleted success if value = 1 : %d", success );
         break;

    }
}
person Vimal Venugopalan    schedule 25.08.2012
comment
Это довольно ненадежно. Представьте, что в вашем календаре 10 мероприятий под названием «Концерт». - person Joris Mans; 01.12.2013
comment
Может ли кто-нибудь помочь в этом: stackoverflow.com/questions/33931231/ - person Mrug; 26.11.2015
comment
ОТЛИЧНЫЙ ОТВЕТ!!!! - Просто используйте startDate и endDate в предикате, и все ваши запросы будут решены. Я отредактировал ответ. - person Kampai; 22.12.2015

Взгляните на EKEvent с eventWithIdentifier на iOS.

Я также обнаружил, что следующий код работает

// eventWithIdentifier returns nil for the external identifier
//EKEvent *eventToRemove = [eventStore eventWithIdentifier:self.expiryCalendarExternalIdentifier];
// So I'm using this method, which seems to work.
- (EKEvent *) getEventForIdentifer: (NSString *) eventIdentifier {
    EKEventStore *eventStore = [Settings getEventStore];
    NSArray *items = [eventStore calendarItemsWithExternalIdentifier:eventIdentifier];
    if ([items count] == 1) {
        return items[0];
    } else {
        [LogFile write:@"getEventForIdentifer: more than one occurrence of event, or no event!"];
        return nil;
    }
}

Пример этого кода в действии (непроверенный):

EKEventStore *eventStore = [[EKEventStore alloc] init];

EKEvent *newCalendarEvent = [EKEvent eventWithEventStore:eventStore];
// Just because we created an EKEvent, the calendarItemExternalIdentifier property of that event has been set.

// I store calendarItemExternalIdentifier (an NSString) in a Core Data
// object, and later fetch it back from core data. 
// Something like:
NSManagedObjectSubclass *coreDataObject = ...
coreDataObject.externalId = newEvent.calendarItemExternalIdentifier;

// So, now let's say we pull the calendarItemExternalIdentifier string from 
// Core Data, and want to remove the event.

NSString *externalId = ... // get calendarItemExternalIdentifier from Core Data

// getEventForIdentifer method from above
EKEvent *eventToRemove = [self getEventForIdentifer:externalId];

NSError *anError = nil;
[eventStore removeEvent:eventToRemove span:EKSpanThisEvent error:&anError];
if (anError) {
   // Something has gone wrong. Report the error.
}
person Chris Prince    schedule 08.02.2014
comment
Помощь. Как получить идентификатор события. Очень смущенный - person vboombatz; 06.05.2015
comment
В своем коде я использую свойство calendarItemExternalIdentifier объекта EKEvent. - person Chris Prince; 07.05.2015
comment
Крис, я все еще не могу заставить это работать. Можете ли вы поделиться фрагментом кода о том, как вы устанавливаете свойство calendarItemExternalIdentifier, а затем как и где вы используете его для удаления события? Спасибо. - person vboombatz; 11.06.2015
comment
См. пример выше. Это помогает? - person Chris Prince; 12.06.2015