【问题标题】:Attempting to save an event in EKEventStore crashes the app尝试在 EKEventStore 中保存事件会使应用程序崩溃
【发布时间】:2015-10-11 12:55:18
【问题描述】:

我的应用程序中有一个非常奇怪的错误。尝试使用 saveEvent 保存事件会导致应用以 3 种方式之一继续:

  • 一切都得到正确保存,没有问题
  • 应用程序崩溃并出现 unrecognized selector sent to instance 错误,其中有问题的选择器是 constraints:,并且它发送到的对象总是不同且相当不可预测(它们几乎总是私有 SDK 类)
  • 应用程序崩溃并出现EXC_BAD_ACCESS 错误

在尝试对此进行调试时,我已将应用程序剥离为仅列出事件的视图控制器,并带有一个添加新事件的按钮。我第一次展示视图控制器来添加一个事件,一切都很顺利,但是我第二次这样做时,它会抛出一个错误。

这是我使用的代码:

self.event = EKEvent(eventStore: self.eventStore!)
self.event!.calendar = self.calendar!
self.event!.startDate = self.defaultStartDate()
self.event!.endDate = self.event!.startDate.dateByAddingTimeInterval(3600)
var error: NSError?
self.eventStore!.saveEvent(self.event!, span:EKSpanThisEvent, error: &error)
if let e = error {
    println("Saving error: \(error)")
}

如果 calendarstartDateendDate 的值无效,我会收到一个没有崩溃的描述性错误,但在这里它会在 self.eventStore!.saveEvent() 处崩溃。任何帮助表示赞赏!

编辑 原来这是由于对self.eventStore.reset() 的一个无关调用。

【问题讨论】:

    标签: ios eventkit ekeventstore


    【解决方案1】:

    经过长时间的搜索,我找到了解决方案。
    您必须将事件保存在 dispatch_async 块上的后台嵌入代码中。

    enum UWCalendarError: Int {
        case AlreadyExists 
        case Generic
        case NotGranted 
    }
    
    class Calendar {
    
    static func saveEvent(title: String, startDate: NSDate, duration: NSTimeInterval, completion: (success: Bool, error: UWCalendarError?) -> Void) {
    
        if Calendar.isEventAlreadyScheduled(title, startDate: startDate, duration: duration) {
            completion(success: false, error: .AlreadyExists)
        } else {
            dispatch_async(dispatch_get_main_queue(),{
                let store = EKEventStore()
                store.requestAccessToEntityType(EKEntityTypeEvent) {(granted, error) in
                    if !granted {
                        completion(success: false, error: .NotGranted)
                    }
                    var event = EKEvent(eventStore: store)
                    event.title = title
                    event.startDate = startDate
                    event.endDate = event.startDate.dateByAddingTimeInterval(duration)
                    event.calendar = store.defaultCalendarForNewEvents
                    var err: NSError?
                    store.saveEvent(event, span: EKSpanThisEvent, commit: true, error: &err)
                    if err == nil {
                        completion(success: true, error: nil)
                    } else {
                        completion(success: false, error: .Generic)
                    }
                }
            })
        }
    }
    
    static func isEventAlreadyScheduled(title: String, startDate: NSDate, duration: NSTimeInterval) -> Bool {
    
        let endDate = startDate.dateByAddingTimeInterval(duration)
        let eventStore = EKEventStore()
        let predicate = eventStore.predicateForEventsWithStartDate(startDate, endDate: endDate, calendars: nil)
        let events = eventStore.eventsMatchingPredicate(predicate)
    
        if events == nil {
            return false
        }
    
        for eventToCheck in events {
            if eventToCheck.title == title {
                return true
            }
        }
    
        return false
    }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多