EKEvent eventIdentifier возвращает ноль - PullRequest
6 голосов
/ 14 октября 2011

Когда я пытаюсь получить идентификатор EKEvent, я получаю только нулевое значение.Поскольку в iOS5 EKEvent является подклассом EKCalendarItem, я подумал, что мог бы получить UUID EKCalendarItem, но он также возвращает ноль.

Время от времени я также получаю эту ошибку, пытаясь получить доступ к идентификатору или свойству UUID:

CADObjectGetInlineStringProperty failed fetching uniqueID for EKPersistentEvent with error Error Domain=NSMachErrorDomain Code=268435459 "The operation couldn’t be completed. (Mach error 268435459 - (ipc/send) invalid destination port)"

Я застрял на этой проблеме довольно давно, но понял,это будет связано с бета-версией iOS5.Но так как мы сейчас на iOS5, он все еще не работает.

Ответы [ 7 ]

7 голосов
/ 20 ноября 2011

В моем приложении я обнаружил, что если вы запрашиваете eventIdentifier, когда eventStore, который его выбрал, был освобожден, он возвращает nil.Но если вы запросите eventIdentifier, прежде чем он вернет идентификатор, хорошо.Затем вы можете освободить экземпляр EKEventStore и без проблем запросить идентификатор .... Кажется, что для получения идентификатора ему требуется eventStore, но я не получаю предупреждений.

7 голосов
/ 04 ноября 2011

Когда я пытаюсь получить идентификатор EKEvent, все, что я получаю, это нулевое значение

Попытка сохранить И зафиксировать ваше событие перед получением идентификатора:

[eventStore saveEvent:event span:EKSpanThisEvent commit:YES error:&err];
NSString *strId = [[NSString alloc] initWithFormat:@"%@", event.eventIdentifier];
2 голосов
/ 28 февраля 2014

Просто пройдя через эту проблему, явка eventIdentifier будет иметь нулевое значение перед фиксацией в базе данных, поэтому вам нужен коммит: YES в функции saveEvent [self.eventStore saveEvent:event span:EKSpanThisEvent commit:YES error:&error];

После этого вы можете получитьидентификатор события.

Моей ошибкой было передать NO для подтверждения: параметр.

2 голосов
/ 22 марта 2012

eventIdentifier устанавливается, когда событие добавляется в EKEventStore. Если вы попытаетесь получить доступ к этому значению перед его добавлением, оно вернет ноль.

0 голосов
/ 22 августа 2017

Для Свифт 3

Я обнаружил, что проблема заключалась в том, что я создал хранилище в функции, которая извлекает дату.

Создание хранилища вне функции и использование его экземпляра решило проблему.

class CalendarServices: NSObject {

    var store = EKEventStore()

    func fetchEventKitCalendarEvents(date: Date, completion: @escaping (_ events: [EKEvent]?, _ error: Error?)->()) {

        let calendar = Calendar.current

        guard self.getEventKitAuthorizationStatus() == .authorized else {
            completion(nil, CoreServices.setError(message: "AuthorizationStatus != authorized"))
            return
        }

        guard let endDate = calendar.date(byAdding: .day, value: 1, to: date)  else {
            completion(nil, CoreServices.setError(message: "Error creating endDate"))
            return
        }

        CoreServices.background {

            let predicate = self.store.predicateForEvents(withStart: date, end: endDate, calendars: self.fetchEventKitCalendars())

            let events = self.store.events(matching: predicate).sorted() {
                (e1: EKEvent, e2: EKEvent) -> Bool in
                return e1.startDate.compare(e2.startDate) == .orderedAscending
            }

            CoreServices.async {

                completion(events, nil)

            }

        }

    }

}
0 голосов
/ 19 мая 2017

Идентификатор события EKEvent не генерируется до тех пор, пока событие не будет сохранено. Вы можете получить доступ к / сохранить eventIdentifier после того, как вы сохранили событие в EKEventStore

    [store saveEvent:event span:EKSpanThisEvent error:&err];
    NSString *eventIdentifier = event.eventIdentifier;
0 голосов
/ 27 декабря 2016

Для меня eventIdentifier - ноль, потому что я не устанавливал endDate. Поэтому обычно eventIdentifier может быть нулевым, если при создании этого события возникла ошибка. Вы можете проверить на наличие ошибок, как это:

NSError *err = nil;
[store saveEvent:event span:EKSpanThisEvent commit:YES error:&err];
NSLog(@"Error : %@",err);
...