2017-01-23 73 views
7

我想创建日历,而不是日历事件,但日历。我无法获取本地来源,并且我的应用程序崩溃。创建日历,即使与iCloud关闭也没有本地源

这里是我的代码:

let newCalendar = EKCalendar(for: .event, eventStore: eventStore) 

newCalendar.title = "Some Calendar Name" 

let sourcesInEventStore = eventStore.sources 

newCalendar.source = sourcesInEventStore.filter{ 
      (source: EKSource) -> Bool in 
      source.sourceType.rawValue == EKSourceType.local.rawValue 
      }.first! 

我有我的iCloud完全关闭,仍然不能得到本地源。

我也试图得到这个工作与iCloud的开启,我想出了这个代码,但它不工作

for let source in eventStore.sources 
     { 
      if(source.sourceType == EKSourceType.calDAV && source.title == "iCloud") 
      { 
       newCalendar.source = source 
      } 
     } 

     if(newCalendar.source == nil) 
     { 
      for let source2 in eventStore.sources 
      { 
       if(source2.sourceType == EKSourceType.local) 
       { 
        newCalendar.source = source2 
       } 
      } 
     } 

回答

4

的几个问题:

你的代码崩溃因为你是从空的数组中强制展开first。以下是一些建议,以确保EKSource对象数组返回一个非空数组。

首先,要求用户使用requestAccess(to:)上的EKEventStore实例访问他们的日历。其次,使用if let从您的已过滤阵列中打开潜在的可选值:

let eventStore = EKEventStore() 

eventStore.requestAccess(to: .event) { (granted, error) in 
    if granted { 
     let newCalendar = EKCalendar(for: .event, eventStore: eventStore) 

     newCalendar.title = "Some Calendar Name" 

     let sourcesInEventStore = eventStore.sources 

     let filteredSources = sourcesInEventStore.filter { $0.sourceType == .local } 

     if let localSource = filteredSources.first { 
      newCalendar.source = localSource 
     } else { 
      // Somehow, the local calendar was not found, handle error accordingly 
     } 

    } else { 
     // check error and alert the user 
    } 
} 
+0

要试一试。 – user979331

+0

我试过这个,我没有得到任何错误,现在警报弹出询问它是否可以使用日历,但是仍然没有本地来源:(它进入else语句中// //不知何故,本地日历未找到,相应地处理错误'我怎样才能得到本地源? – user979331

+0

@ user979331警报是正常的,你需要询问用户使用他们的日历的权限我不知道为什么不会有本地日历。日历都在sourcesInEventStore? – JAL