我试图在我的swift应用程序中设置一个简单的EKReminder来提醒用户赶上总线。但是,当我尝试保存提醒时,我总是收到错误(没有报告错误,应用程序崩溃)。我有以下代码。
public class func createReminder(reminderTitle: String, timeInterval: NSDate) {
var calendarDatabase = EKEventStore()
calendarDatabase.requestAccessToEntityType(EKEntityTypeReminder,
completion: nil)
let reminder = EKReminder(eventStore: calendarDatabase)
reminder.title = reminderTitle
let alarm = EKAlarm(absoluteDate: timeInterval)
reminder.addAlarm(alarm)
reminder.calendar = calendarDatabase.defaultCalendarForNewReminders()
var error: NSError?
calendarDatabase.saveReminder(reminder, commit: true, error: &error)
}
答案 0 :(得分:2)
以下内容应在Swift 4.2
func AddReminder() {
eventStore.requestAccess(to: EKEntityType.reminder, completion: {
granted, error in
if (granted) && (error == nil) {
print("granted \(granted)")
let reminder:EKReminder = EKReminder(eventStore: self.eventStore)
reminder.title = "Must do this!"
reminder.priority = 2
// How to show completed
//reminder.completionDate = Date()
reminder.notes = "...this is a note"
let alarmTime = Date().addingTimeInterval(1*60*24*3)
let alarm = EKAlarm(absoluteDate: alarmTime)
reminder.addAlarm(alarm)
reminder.calendar = self.eventStore.defaultCalendarForNewReminders()
do {
try self.eventStore.save(reminder, commit: true)
} catch {
print("Cannot save")
return
}
print("Reminder saved")
}
})
}
答案 1 :(得分:0)
我以前没有使用过这样的东西,但是看看你的代码,我可以看到你调用requestAccessToEntity
- 方法,而不处理响应。该方法很可能会向用户显示提示,要求他们接受您的应用有权访问"提醒"。使用您的代码,您需要获得许可,但代码的其余部分将在询问后立即执行,而不会等待'为了回应。第一次运行此代码时,将询问用户,并且您的提醒将被拒绝,因为它会立即尝试保存。
即使您的用户点击了"允许",您的代码也已经未经许可运行。
现在,如果用户点击允许一次,然后尝试再次执行相同操作,那么也许它会起作用,我不知道。但是,如果您的用户点击了"取消"在提示符下,您的代码将永远无法运行,直到他们进入“设置”并允许您的应用显示提醒。
在您知道用户是否允许之前,您不应该创建提醒,因此您应该将此功能分成两个单独的功能。并且不要在nil
中传递completion
该函数;处理回应。
答案 2 :(得分:-1)
尝试以下方法:
EKEntityTypeReminder -> EKEntityType.Reminder