Подходящие ситуации для создания нового EKCalendar iOS

Я работаю над приложением для iOS, которое создает, обновляет и удаляет EKEvents. Этого легко добиться, сохранив события в EKEventStore.defaultCalendarForNewEvents. При каких обстоятельствах я хотел бы создать новый EKCalendar для своего собственного приложения и какие функции это влечет за собой?

Я спрашиваю, потому что в настоящее время я пытаюсь создать календарь в Swift 3.0, и он продолжает терпеть неудачу, что заставляет меня блуждать, в первую очередь, какова цель нового календаря.

fileprivate var eventStore = EKEventStore()
fileprivate var newCalendar : EKCalendar?

func createNewCalendar() {
    self.newCalendar = EKCalendar(for: .event, eventStore: self.eventStore)
    self.newCalendar!.title = "newCal"
    let sourcesInEventStore = self.eventStore.sources
    self.newCalendar!.source = eventStore.defaultCalendarForNewEvents.source

    let newCalIndex = sourcesInEventStore.index {$0.title == "newCal"}
    if newCalIndex == nil {
        do {
            try self.eventStore.saveCalendar(self.newCalendar!, commit: true)
            print("cal succesful")
        } catch {
            print("cal failed")
        }
    }
}

Я знаю, что у меня есть доступ к eventStore, потому что я могу получать события, а также сохранять их в EKEventStore.defaultCalendarForNewEvents и обновлять их, используя их существующий календарь.


person Dustin Spengler    schedule 20.09.2016    source источник


Ответы (1)


Может быть много причин, по которым вы хотите создать новый календарь. Лично я выбираю создание нового календаря, когда хочу отделить группу событий от тех, которые были созданы и привязаны к календарю по умолчанию. Таким образом, вы также пользуетесь преимуществами массового удаления вновь созданных событий, когда считаете, что они вам не нужны. Просто удалите календарь, и все его события также будут удалены.

Кстати, если вы не уверены, каким должен быть source (iCloud, локальный, возможно, привязанный к какой-либо почтовой учетной записи и т. д.) календаря, который вы хотите создать, просто используйте источник по умолчанию. :

let newCalendar = EKCalendar(forEntityType: .Event, eventStore: eventStore)
newCalendar.source = eventStore.defaultCalendarForNewEvents.source

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

person ozgur    schedule 20.09.2016
comment
Вы тестировали этот код? Я пробовал это в течение нескольких часов, и каждый раз, когда он пытается сохранить, он терпит неудачу. Я даже скопировал и вставил ваш код дословно, но безрезультатно. - person Dustin Spengler; 20.09.2016
comment
Каково значение eventStore в вашей программе? Это должен быть экземпляр EKEventStore, а не объект класса. Пожалуйста, покажите нам код и сообщение об ошибке в вашем вопросе. - person ozgur; 20.09.2016
comment
Вы столкнулись с ошибкой или предупреждением в панели отладки? Вы сначала получили разрешение пользователя, позвонив eventStore.requestAccessToEntityType(.Event) - person ozgur; 20.09.2016
comment
только что распечатал ошибку: Error Domain=EKErrorDomain Code=17 "That account does not allow calendars to be added or removed." UserInfo={NSLocalizedDescription=That account does not allow calendars to be added or removed.} - person Dustin Spengler; 20.09.2016
comment
Я думаю, что это связано с эта проблема. Возможно, вы захотите использовать другое значение source, например local или iCloud. - person ozgur; 20.09.2016
comment
Оказывается, это связано с тем, что Gmail не хочет синхронизироваться. Просто любопытно, если я сохраню событие в новом календаре, который я создал, будет ли оно видно в моем gmail (который синхронизируется)? - person Dustin Spengler; 20.09.2016