简体   繁体   English

EKEvent event.eventIdentifier 没有删除

[英]EKEvent event.eventIdentifier not removing

I am trying to remove an event I saved in the calendar with an event id but its removing a different event and sometimes it doesn't remove anything.我正在尝试使用事件 ID 删除我在日历中保存的事件,但它删除了一个不同的事件,有时它不会删除任何内容。

I am saving the eventId in a realm database when event is created and reading it back when I want to delete but its not working.我在创建事件时将 eventId 保存在领域数据库中,并在我想删除但它不起作用时读回它。

I have tried running it on an actual device, using an array instead of a dictionary, changing the span to .futureEvents but still doesn't work我尝试在实际设备上运行它,使用数组而不是字典,将跨度更改为.futureEvents但仍然不起作用

my code for creating event and saving to realm database我用于创建事件并保存到领域数据库的代码

/// function exits in another class
func addEventToCalendar(userName: String, userDate: Date) {

    let userDefaults = UserDefaults.standard

    let eventStore: EKEventStore = EKEventStore()
    eventStore.requestAccess(to: .event) { (granted, error) in

        if (granted) && (error == nil) {
            print("granted \(granted)")
            print("error \(String(describing: error))")

            let event: EKEvent = EKEvent(eventStore: eventStore)
            event.title = "\(userName) Birthday"
            event.startDate = userDate
            event.endDate = userDate
            event.notes = "Happy Birthday!"
            event.isAllDay = true
            event.calendar = eventStore.defaultCalendarForNewEvents
            let ekrules: EKRecurrenceRule = EKRecurrenceRule.init(recurrenceWith: .yearly, interval: 1, end: nil)
            event.recurrenceRules = [ekrules]
            //event.addAlarm(EKAlarm(absoluteDate: event.startDate))
            //sets alert 00:00 on day of event
            event.addAlarm(EKAlarm(relativeOffset: 0))

            do {

                try eventStore.save(event, span: .thisEvent, commit: true)

            } catch let error as NSError {
                print("error: \(error)")
            }
            let eventId = event.eventIdentifier ?? "nil-id"

            userDefaults.setValue(eventId, forKey: "eventId")
            print(eventId)

        } else {
            print("error not granted: \(String(describing: error))")
        }
    }
}

//saving it in a view controller class
@IBAction func okBtnPressed(_ sender: UIButton) {

let eventId = UserDefaults.standard.string(forKey: "eventId") ?? "no-id"

            //// saving data to device
            let newItem = Item()
            newItem.userImageName = String(describing: userImageUrl)
            newItem.userName = uName
            newItem.isYearPresent = uYearPresent
            newItem.userDOB = uDOB
            newItem.color = UIColor.init(randomFlatColorOf: .dark).hexValue()
            newItem.daysRemaining = daysRemain
            newItem.eventId = eventId

            self.save(item: newItem)
}

The event id saves succesfully in the realm database.事件 ID 成功保存在领域数据库中。

function for removing the event from calendar从日历中删除事件的功能

func removeEvent(id: String) {
    let store = EKEventStore()

    store.requestAccess(to: .event) { (granted, error) in
        if !granted { return }
        // checking if event exists
        if let eventToRemove = store.event(withIdentifier: id) {
            do {
                print("removing: \(id)")
                try store.remove(eventToRemove, span: .thisEvent, commit: true)
                print("event removed sucessfully")
            } catch let error as NSError {
                print("error: \(error)")
            }

        } else {
            print("event doesnt exist.")
        }

    }
}

This is how I remove it这就是我删除它的方式

var eventIDS = [Int: String]()

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// inserting evenIds to dictionary to access it in remove function
// I used an array but it gave me the same problem
if let item = itemsObject?[indexPath.row] {
    eventIDS[indexPath.row] = item.eventId
}

}
// then I call remove function when swipe taps on cell
removeEvent(id: self.eventIDS[indexPath.row] ?? "")

Sometimes I get event removed successfully but it removes a different event, sometimes I get the following errors有时我成功删除事件但它删除了不同的事件,有时我收到以下错误

Error getting event with identifier 2BD633CA-BBEA-47CD-8410-40BCE6362A5C:98D9EAF2-D5EF-420F-B769-7F02B7795E54: Error Domain=EKCADErrorDomain Code=1010 "(null)"
event doesnt exist.

I figured it out.我想到了。 Because eventStore.requestAccess(to: .event) is asynchronous, I was saving the event id in the database before the id existed.因为eventStore.requestAccess(to: .event)是异步的,所以我在 id 存在之前将事件 id 保存在数据库中。

So I had to declare the function to accept a completion handler and return the value inside the completion handler.因此,我必须声明该函数以接受完成处理程序并返回完成处理程序中的值。

//// adding events to calendar
func addEventToCalendar(userName: String, userDate: Date, completion: @escaping (String?)->()) {
    
    let userDefaults = UserDefaults.standard
    var eventId = ""
    
    let eventStore: EKEventStore = EKEventStore()
    eventStore.requestAccess(to: .event) { (granted, error) in

        if (granted) && (error == nil) {
            print("granted \(granted)")
            print("error \(String(describing: error))")

            let event: EKEvent = EKEvent(eventStore: eventStore)
            event.title = "\(userName) \(NSLocalizedString("birthday", comment: "birthday"))"
            event.startDate = userDate
            event.endDate = userDate
            event.notes = NSLocalizedString("happyBirthday", comment: "happyBirthday")
            event.isAllDay = true
            event.calendar = eventStore.defaultCalendarForNewEvents
            let ekrules: EKRecurrenceRule = EKRecurrenceRule.init(recurrenceWith: .yearly, interval: 1, end: nil)
            event.recurrenceRules = [ekrules]
            //event.addAlarm(EKAlarm(absoluteDate: event.startDate))
            //sets alert 00:00 on day of event
            event.addAlarm(EKAlarm(relativeOffset: 0))
            
            do {
                
                try eventStore.save(event, span: .futureEvents, commit: true)
                eventId = event.eventIdentifier ?? "no-Id"
                print("Event has been saved with id \(String(describing: eventId))")
                userDefaults.setValue(eventId, forKey: "eventId")
                
            } catch let error as NSError {
                print("error: \(error)")
            }
            completion(eventId)

        } else {
            print("error not granted: \(String(describing: error))")
            completion(nil)
        }
        
    }
    
}

and then use it like so然后像这样使用它

 addEventToCalendar(userName: uName, userDate: uDate) { (eventIdentifier) in
                
                if let eventId = eventIdentifier {
                    print("Event add birthday id \(eventId)")
                    //// saving data to device
                    
// run on main thread to avoid 'RLMException', reason: 'Realm accessed from incorrect thread.'
                    DispatchQueue.main.async {
                        
                        let newItem = Item()
                        newItem.userImageName = String(describing: self.userImageUrl)
                        newItem.userName = uName
                        newItem.isYearPresent = uYearPresent
                        newItem.userDOB = uDOB
                        newItem.color = UIColor.init(randomFlatColorOf: .dark).hexValue()
                        newItem.daysRemaining = daysRemain
                        newItem.eventId = eventId

                        self.save(item: newItem)
                        
                        // review app
                        self.review()
                    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM