gpt4 book ai didi

ios - 尝试在 EKEventStore 中保存事件会使应用程序崩溃

转载 作者:行者123 更新时间:2023-11-29 12:17:55 25 4
gpt4 key购买 nike

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

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

在尝试对此进行调试时,我已将应用剥离为仅列出事件的 View Controller ,以及用于添加新事件的按钮。第一次显示 View Controller 以添加事件时,一切都进行得很顺利,但第二次这样做时,它会抛出错误。

这是我使用的代码:

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() 的无关调用。

最佳答案

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

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
}

}

关于ios - 尝试在 EKEventStore 中保存事件会使应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31549747/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com