首页 > 解决方案 > 使用 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)

有任何想法吗?

标签: iosswiftcalendareventkitekeventstore

解决方案


我看到您遇到的问题的更多可能原因:

  1. TESTCAL 日历未成功创建。您可以通过捕获保存日历时可能引发的错误来验证日历的创建:

        do {
           try eventStore.saveCalendar(newCal, commit: true)
        } catch {
            print(error)
        }
    
  2. 从您发布的代码中不清楚事件保存是如何发生的。

    如果您正在为用户提供 EKEventEditViewController 实例以完成事件创建,则您缺少在 addToCal 方法中设置视图控制器上的事件:

    eventVC.event = 事件

    如果要直接保存事件,则不需要使用 EKEventEditViewController,而是在 eventStore 上调用 save:

    do {
       try eventStore.save(event, span: .thisEvent)
    } catch {
        print(error)
    }  
    
  3. 对于共享日历,在目标的 .plist 文件中需要一个额外的用于联系人访问的隐私密钥,即 NSContactsUsageDescription。如果没有这个键,访问共享日历会导致崩溃。

在检查/处理完上述所有内容后,您在活动上设置日历的解决方案应该可以工作:

event.calendar = eventStore.calendar(withIdentifier: self.calIdent)

此外,请确保在进行任何日历/事件操作之前,已准备好用于请求用户访问事件工具包商店的代码。有关请求访问的更多信息,请查看https://developer.apple.com/documentation/eventkit/ekeventstore/1507547-requestaccess


推荐阅读