【问题标题】:Problems fetching events from EKEventStore从 EKEventStore 获取事件的问题
【发布时间】:2019-01-28 19:11:57
【问题描述】:

我正在尝试从 EventStore 中读取所有日历事件。我使用的例程有时有效,但并非总是有效。

func getCalendarEvents(_ anfangOpt: Date?, _ endeOpt: Date?) -> [EKEvent]? {
    guard let anfang = anfangOpt, let ende = endeOpt else { return nil }
    var events: [EKEvent]? = nil
    let eventStore = EKEventStore()
    eventStore.requestAccess( to: EKEntityType.event, completion: { _,_ in })
    if EKEventStore.authorizationStatus(for: EKEntityType.event) == EKAuthorizationStatus.authorized {
        var predicate: NSPredicate? = nil
        predicate = eventStore.predicateForEvents(withStart: anfang, end: ende, calendars: nil)
        if let aPredicate = predicate {
            events = eventStore.events(matching: aPredicate)

        }
    }
    return events
}

这个函数总是返回事件。但它们有时是不完整的。这样

for event in bereinigteEvents {
    if dateInInterval(prüfdatum, start: event.startDate, ende: event.endDate) {
        istimurlaub = true
        if let zwischenname = event.title {
            eventname = zwischenname
        } else {
            eventname = "n/a"
        }
        eventcalendar = event.calendar.title
        trigger.append ("Auslöser: „" + eventname + "“ im Kalender „" + eventcalendar + "“")
    }
}

有时会在“eventcalendar = event.calendar.title”行崩溃,并出现意外发现“nil”的错误消息。

谢谢!

在第一个答案之后,我更改了函数,它将事件变为:

func getCalendarEvents(_ anfangOpt: Date?, _ endeOpt: Date?) -> [EKEvent]? {

    guard let anfang = anfangOpt, let ende = endeOpt else { return nil }
    var events: [EKEvent]? = nil
    let eventStore = EKEventStore()

    func fetchEvents() {
        var predicate: NSPredicate? = nil
        predicate = eventStore.predicateForEvents(withStart: anfang, end: ende, calendars: nil)
        if let aPredicate = predicate {
            events = eventStore.events(matching: aPredicate)
        }
    }

    if EKEventStore.authorizationStatus(for: EKEntityType.event) == EKAuthorizationStatus.authorized {
        fetchEvents()
    } else {
        eventStore.requestAccess( to: EKEntityType.event, completion: {(granted, error) in
            if (granted) && (error == nil) {
                fetchEvents()
                }
        })
    }
    return events
}

但它仍然会因“event.calendar.title”中的“unexpectedly found nil”而崩溃。

我最终使用了这个

Swift 4 How to get all events from calendar?

获取事件的例程。

问题有时仍然会出现(!!):偶尔会在“event.calender.title”中找到“nil”,尽管它不应该是“nil”

【问题讨论】:

    标签: ios swift eventkit


    【解决方案1】:

    线

    eventStore.requestAccess( to: EKEntityType.event, completion: { _,_ in })
    

    毫无意义,因为它是异步工​​作的。 下一行检查authorizationStatus之后返回请求的结果。

    我建议首先检查状态。如果未授予访问权限,请请求许可并执行获取。如果它被授予直接执行提取。这可以通过将获取事件的代码移动到方法中来实现。

    注意:

    您似乎想要在调用该方法时获取事件。为什么将开始和结束日期声明为可选并检查nil

    声明

    func getCalendarEvents(_ anfang: Date, _ ende: Date) -> [EKEvent]? { ...
    

    然后您会在编译时收到通知参数是否为nil


    PS: Deutsche Parameternamen mit Umlauten sehen sehr lustig aus。 (带有变音符号的德语参数名称看起来很有趣)

    【讨论】:

    • 谢谢。我已经进行了更改(请参阅我的问题的编辑),但它仍然崩溃。
    【解决方案2】:

    问题是,event.calendar 实际上是一个可选的(我不知道)。

    if let eventZwischenCal = event.calendar {
        eventcalendar = eventZwischenCal.title
    } else {
        eventcalendar = "n/a"
    }
    

    解决问题。

    【讨论】:

      猜你喜欢
      • 2012-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-30
      • 2018-08-25
      • 1970-01-01
      • 1970-01-01
      • 2016-08-27
      相关资源
      最近更新 更多