swiftekeventstore

How I can fix error "No start date has been set"?


When saving an event in the regular calendar, the events are sometimes not saved. An error is displayed: "failed to save event with error: Error Domain = EKErrorDomain Code = 2" No start date has been set. "UserInfo = {NSLocalizedDescription = No start date has been set.}", Although the date is determined correctly

func saveTaskInCalendar() {
        let eventStore : EKEventStore = EKEventStore()
        eventStore.requestAccess(to: .event) { (granted, error) in
            if (granted) && (error == nil) {
                let event: EKEvent = EKEvent(eventStore: eventStore)
                DispatchQueue.main.async {
                    event.title = "Test"
                    event.startDate = Date()
                    event.endDate = Date()
                }
                event.calendar = eventStore.defaultCalendarForNewEvents
                do {
                    try eventStore.save(event, span: .thisEvent)
                } catch let error as NSError {
                    print("failed to save event with error : \(error)")
                }
            }
            else {
                print("failed to save event with error : \(String(describing: error)) or access not granted")
            }
        }
    }

How do I fix this error?


Solution

  • The problem is that you wrap setting the properties of the EKEvent in a dispatch async block, while you save the even outside the async block. This can cause the property setting to be executed after you've already tried saving the event.

    Either remove the DispatchQueue.main.async call, since it shouldn't be necessary anyways or put the saving code inside the dispatch async as well.

    let event: EKEvent = EKEvent(eventStore: eventStore)
    event.title = "Test"
    event.startDate = Date()
    event.endDate = Date()
    event.calendar = eventStore.defaultCalendarForNewEvents
    do {
        try eventStore.save(event, span: .thisEvent)
    }
    

    or

    DispatchQueue.main.async {
        let event: EKEvent = EKEvent(eventStore: eventStore)
        event.title = "Test"
        event.startDate = Date()
        event.endDate = Date()
        event.calendar = eventStore.defaultCalendarForNewEvents
        do {
            try eventStore.save(event, span: .thisEvent)
        }
    ...