Search code examples
iosswiftekevent

for addAlarm of a EKevent not work swift


I would like to register in the iPhone calendar, using addAlarm of a EKevent, a number of alarms from days stored into an array.

The result however is only the registration of the last date of N included.

Debugging the FOR cycle, in the variable idEvent I always find the same id.

These are the relevant steps to the management of the alarms:

let store = EKEventStore()
…
func PlanDays(sType: String) {
    //Calculates the days to schedule on the bases of the rules and records them  in the array.
    var dayToPlan = [NSDate]()
    …..
    // An example of adding an extra  date: 
    var dateformatter = NSDateFormatter()
    dateformatter.timeZone = NSTimeZone(name: “GMT”)
    dateformatter.dateStyle = NSDateFormatterStyle.MediumStyle
    dateformatter.locale = NSLocale(localeIdentifier: “it_IT”)
    var From: NSDate = dateformatter.dateFromString(txtdateFrom.text)!
    dayToPlan.append(From)
}
…
// Popup asking if I’ld like to proceed and if I do: 
let Procedo = UIAlertAction(title: “YES!”, style: .Default) { action -> Void in
    var ret: Bool = false
    var event = EKEvent(eventStore: self.store)
    var err: NSError?
    event.calendar = self.store.defaultCalendarForNewEvents
    for giorno in dayToPlan {
        event.startDate = giorno
        event.endDate = giorno
        event.title = self.txtTesto.text
        event.addAlarm(EKAlarm(absoluteDate: event.startDate))
        ret = self.store.saveEvent(event, span: EKSpanThisEvent, commit: true , error: &err)
        idEvento = event.eventIdentifier
    }
    ….
}

Can anyone help me?

Thanks


Solution

  • You're creating the EKEvent instance outside the loop, that results in reusing the same instance again and again. If you want one single event for each day / al giorno create a new event inside the loop.

    let Procedo = UIAlertAction(title: “YES!”, style: .Default) { action -> Void in
        var ret: Bool = false
        var err: NSError?
        event.calendar = self.store.defaultCalendarForNewEvents
        for giorno in dayToPlan {
            let event = EKEvent(eventStore: self.store)
            event.startDate = giorno
            event.endDate = giorno
            event.title = self.txtTesto.text
            event.addAlarm(EKAlarm(absoluteDate: event.startDate))
            ret = self.store.saveEvent(event, span: EKSpanThisEvent, commit: true , error: &err)
            idEvento = event.eventIdentifier
        }
        ….