I know this might also be late, but at least it works with Swift and not ObjC. I made two functions, one that creates Date events in the bottom, and another one that creates recurring events called addEventToCalendar. Note that you still need to clarify which day of the week that specific event is.
If you still have doubts on how events work I suggest consulting this link.
func addEventToCalendar(title: String, description: String?, startDate: Date, endDate: Date, completion: ((_ success: Bool, _ error: NSError?) -> Void)? = nil){
let eventStore = EKEventStore()
eventStore.requestAccess(to: .event, completion: { (granted, error) in
if (granted) && (error == nil) {
let event = EKEvent(eventStore: eventStore)
event.title = title
event.startDate = startDate
event.endDate = startDate
event.notes = description
event.calendar = eventStore.defaultCalendarForNewEvents
let recurrenceRule = EKRecurrenceRule.init(
recurrenceWith: .daily,
interval: 1,
daysOfTheWeek: [EKRecurrenceDayOfWeek.init(EKWeekday.saturday)],
daysOfTheMonth: nil,
monthsOfTheYear: nil,
weeksOfTheYear: nil,
daysOfTheYear: nil,
setPositions: nil,
end: EKRecurrenceEnd.init(end:endDate)
)
event.recurrenceRules = [recurrenceRule]
do {
try eventStore.save(event, span: .thisEvent)
} catch let e as NSError {
completion?(false, e)
return
}
completion?(true, nil)
} else {
completion?(false, error as NSError?)
}
})
}
private func createDate(date: String!, hours: Int!, minutes:Int! ) -> Date{
var fullDateArr = date.components(separatedBy: "-")
let startMonth: Int? = Int(fullDateArr[0])!
let startDay: Int? = Int(fullDateArr[1])!
let startYear: Int = Int(fullDateArr[2])!
var dateComponents = DateComponents()
dateComponents.year = startYear
dateComponents.month = startMonth
dateComponents.day = startDay
dateComponents.timeZone = TimeZone(abbreviation: "MDT") // ELP Standard Time
dateComponents.hour = hours
dateComponents.minute = minutes
let userCalendar = Calendar.current // user calendar
let someDateTime = userCalendar.date(from: dateComponents)
return someDateTime!
}