2017-01-23 1 views
7

Я пытаюсь создать Календарь, а не событие календаря, но календарь. Я не могу получить локальный источник, и мое приложение падает.Создать календарь, не локальный источник, даже с iCloud off

Вот мой код:

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

Смежные вопросы