Ios 如何识别用于存储用户日历选择的日历

Ios 如何识别用于存储用户日历选择的日历,ios,swift,uniqueidentifier,eventkit,ekcalendar,Ios,Swift,Uniqueidentifier,Eventkit,Ekcalendar,在使用用户日历时,我实现了一个EKCalendarChooser,它允许用户选择多个日历。所选的日历实例检索得很好。现在我以后想使用此选项,但如何永久存储它 我的第一种方法是使用日历标识符,并将它们作为字符串数组存储到UserDefaults中,如 @State private var calendarSelection: [EKCalendar] // my approach to convert the calendar selection into a storable format

在使用用户日历时,我实现了一个EKCalendarChooser,它允许用户选择多个日历。所选的日历实例检索得很好。现在我以后想使用此选项,但如何永久存储它

我的第一种方法是使用日历标识符,并将它们作为字符串数组存储到UserDefaults中,如

@State private var calendarSelection: [EKCalendar]

// my approach to convert the calendar selection into a storable format (string array of ids)
var selectedIds = [String]()
for calendar in calendarSelection {
    selectedIds.append(calendar.calendarIdentifier)
}

// now store the string-array, eg. to user defaults:
UserDefaults.standard.set(selectedIds, forKey: "cids")
不幸的是,这不起作用,因为
calendarIdentifier
不是一个永久标识符,因此会随时间而变化。正如苹果在其文档中所述:

与日历完全同步将丢失此标识符。您应该有一个计划来处理其标识符不再能够通过缓存其其他属性来获取的日历


那么,如何存储用户选择的日历呢?

好的,这对我现在很有用。
我存储日历标识符

func calendarChooserDidFinish(_ calendarChooser: EKCalendarChooser) {
    ...
    // store selected calendar identifier
    selectedCalendar = calendarChooser.selectedCalendars.first?.calendarIdentifier
    ...
}
。。。然后恢复它

func showCalendarChooser() {
    ...
    // check if calendar identifier still exists
    if let selectedCalendarIdentifier = eventStore.calendar(withIdentifier: selectedCalendar) {
        //select stored calendar
        calendarChooser.selectedCalendars = [selectedCalendarIdentifier]
    }
    ...
}
这仅适用于1个选定日历(
selectionStyle:.single
)。
将此代码更改为多个日历应该很简单

我还测试了日历标识符是否会更改。。。到目前为止还没有欢乐。在所有测试期间,它保持不变。如果需要更改(
nil
),则不会选择日历,应用程序也不会崩溃


HTH

我目前也在努力解决这个问题。你喜欢这个问题的解决方案吗?我花了很多时间在这里寻找一个解决方案,但不幸的是,我最终非常惊讶,这似乎是不可能的。通常情况下,如果存在不同的方法,情况就是这样,但我也找不到这样的方法。所以剩下的就是存储一个日历的名称,这个名称不太可能更改,但仍然可能更改,并且根据使用情况可能会导致重大问题。嗯,我经常更改标识符,但不是所有日历的标识符。您是否为日历启用了iCloud同步?除了本地/iCloud日历,还有其他日历吗?由于文档不能保证它不会改变,我认为依赖它可能是个坏主意。当然,这取决于使用情况。是的,我已经为日历启用了iCloud同步。除此之外,我大量使用本地日历和谷歌日历(包括一些可以访问这些日历的人)。我没有在苹果文档中找到关于你提到的不断变化的标识符的参考资料。对我来说,上述解决方案现在是完美的(没有更改标识符),并且在更改标识符的情况下是可以接受的,因为我相信这不会经常发生。无论如何,如果发生这种情况,最糟糕的是需要再次选择日历(没有崩溃!)。在我的情况下,它更改得如此频繁,以至于完全没有用,但很高兴它能为您工作。苹果文档的引用:其中写道:“与日历完全同步将丢失此标识符。您应该有一个计划来处理其标识符不再能够通过缓存其其他属性获取的日历。”感谢链接。我会报告我这边的日历标识符是否发生变化。然而,我真的不明白为什么完全同步需要更改日历标识符(从技术上讲)。