ios - 使用 Swift,我如何将新事件添加到以前创建的日历中?
问题描述
我在 swift 中创建了一个函数,它检查当前保存在 iOS 设备上的所有日历,然后如果不存在具有特定标题“TESTCAL”(在本例中)的日历,则创建一个新的。
func checkCal(){
print("checkCal")
let calendars = eventStore.calendars(for: EKEntityType.event) as [EKCalendar]
var exists = false
for calendar in calendars {
if calendar.title == "TESTCAL"{
exists = true
print("FOUND CAL: TESTCAL")
print(calendar.title)
print(calendar.calendarIdentifier)
self.calIdent = calendar.calendarIdentifier
} else{
print("NO CAL: ", calendar.title)
}
}
if exists == false {
let newCal = EKCalendar(for: EKEntityType.event, eventStore: eventStore)
newCal.title = "TESTCAL"
newCal.source = eventStore.defaultCalendarForNewEvents?.source
_ = try? eventStore.saveCalendar(newCal, commit: true)
print("CAL CREATED: ", newCal.title)
print("With Ident: ", newCal.calendarIdentifier)
self.calIdent = newCal.calendarIdentifier
}
addToCal()
}
然后等我来添加事件的时候,通过以下方式
func addToCal()
{
let eventVC = EKEventEditViewController()
eventVC.editViewDelegate = self
eventVC.eventStore = EKEventStore()
let date = self.passedDate
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd-MM-yy"
let dateForCal = dateFormatter.date(from: date)
let event = EKEvent(eventStore: eventVC.eventStore)
event.title = self.passedTitle
event.notes = self.passedDetail
event.startDate = dateForCal
event.endDate = dateForCal
event.isAllDay = true
event.url = URL(string: passedWebLink) }
该事件被添加到 iOS 默认日历中。
我尝试将以下代码添加到 addCal() 函数中:
event.calendar = eventStore.calendar(withIdentifier: self.calIdent)
和
let calendars = eventStore.calendars(for: EKEntityType.event) as [EKCalendar]
for calendar in calendars {
if calendar.title == "TESTCAL"{
event.calendar = calendar
print("YES")
} else{
print("NO")
}
}
这两个都在 AppDelegate 中给我错误消息并导致崩溃:
[EventKit] Error getting shared calendar invitaions for entity types 3 from daemon: Error Domain=EKCADErrorDomain Code 1014 "(null)
有任何想法吗?
解决方案
我看到您遇到的问题的更多可能原因:
TESTCAL 日历未成功创建。您可以通过捕获保存日历时可能引发的错误来验证日历的创建:
do { try eventStore.saveCalendar(newCal, commit: true) } catch { print(error) }
从您发布的代码中不清楚事件保存是如何发生的。
如果您正在为用户提供 EKEventEditViewController 实例以完成事件创建,则您缺少在 addToCal 方法中设置视图控制器上的事件:
eventVC.event = 事件
如果要直接保存事件,则不需要使用 EKEventEditViewController,而是在 eventStore 上调用 save:
do { try eventStore.save(event, span: .thisEvent) } catch { print(error) }
对于共享日历,在目标的 .plist 文件中需要一个额外的用于联系人访问的隐私密钥,即 NSContactsUsageDescription。如果没有这个键,访问共享日历会导致崩溃。
在检查/处理完上述所有内容后,您在活动上设置日历的解决方案应该可以工作:
event.calendar = eventStore.calendar(withIdentifier: self.calIdent)
此外,请确保在进行任何日历/事件操作之前,已准备好用于请求用户访问事件工具包商店的代码。有关请求访问的更多信息,请查看https://developer.apple.com/documentation/eventkit/ekeventstore/1507547-requestaccess
推荐阅读
- android - 单击软键盘上的“搜索”按钮时,搜索视图消失
- python-3.x - python - 如果在使用两个文件搜索时字典中缺少值字段,如何跳过或放置None
- php - 按键值对数组进行排序,然后得到数组中的 5 个最高和最低值
- c# - ValidateAntiForgeryToken Filter is not working
- java - Java功能接口的单例作为枚举
- angular - Angular:在内容投影时获取对父组件的引用
- python-3.x - 如何处理熊猫列中不同类型的日期
- python - python运算符重载__radd__和__add__
- powershell - How to delete first line of a file from powershell ise?
- excel - How to use formulas in Excel to pick a value from a sheet similar to SQL