ios - 使用 Swift,我如何将新事件添加到以前创建的日历中?

标签 ios swift calendar eventkit ekeventstore

我在 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 实例
    完成事件创建,您缺少在 View 上设置事件
    addToCal 方法中的 Controller :

    eventVC.event = 事件

    如果你想直接保存事件,那么你不需要使用
    EKEventEditViewController,而是在 eventStore 上调用 save:
    do {
       try eventStore.save(event, span: .thisEvent)
    } catch {
        print(error)
    }  
    
  • 对于共享日历,在目标的 .plist 文件中需要一个额外的用于联系人访问的隐私 key ,即 NSContactsUsageDescription。如果没有这个键,访问共享日历会导致崩溃。

  • 在检查/处理完上述所有内容后,您在事件上设置日历的解决方案应该可以工作:
    event.calendar = eventStore.calendar(withIdentifier: self.calIdent)
    

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

    关于ios - 使用 Swift,我如何将新事件添加到以前创建的日历中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61320577/

    相关文章:

    ios - App Store 上没有更新按钮?

    ios - 核心数据错误 1550

    ios - 向堆栈 View 中存在的 ImageView 添加按钮

    java - 如何设置字符串(HH :mm) to UTC time with current date and convert it to local time

    java - 在java中获取日期

    ios - 您可以为 NSKeyedArchiver archivedDataWithRootObject 禁用 "mangled runtime name"崩溃/警告吗?

    ios - 从实用程序应用程序导航 Controller View 发送到实例错误的无法识别的选择器

    c# - EWS : Calendar Sharing Invitation and Extended Properties

    ios - 自动调整自定义 UITableViewCell 的大小

    objective-c - 我如何从 objective-c 代码中获取 Swift AppDelegate 的引用