2017-01-23 28 views
7

Próbuję utworzyć Kalendarz, a nie wydarzenie w kalendarzu, ale Kalendarz. Nie mogę uzyskać lokalnego źródła i moja aplikacja się zawiesza.Tworzenie kalendarza bez lokalnego źródła, nawet przy wyłączonym iCloud

Oto mój kod:

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! 

Mam iCloud całkowicie wyłączony i nadal nie może uzyskać dostępu do sieci.

Jestem również staramy się to do pracy z iCloud włączony, wpadłem na ten kod, ale to nie działa

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 
       } 
      } 
     } 

Odpowiedz

4

kilka problemów:

kod jest upaść ponieważ rozpakowuje się na siłę first z pustej tablicy. Oto kilka sugestii, aby upewnić się, że tablica obiektów EKSource zwraca niepustą tablicę.

Najpierw poproś użytkownika o dostęp do jego kalendarza za pomocą requestAccess(to:) w instancji EKEventStore. Po drugie, użyj numeru if let, aby rozwinąć potencjalnie opcjonalną wartość z przefiltrowanej tablicy:

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

Spróbuję. – user979331

+0

Próbowałem tego, nie dostaję żadnych błędów i teraz wyskakuje alert z pytaniem, czy jest w porządku, aby użyć kalendarza, jednak wciąż nie ma lokalnego źródła :(Przechodzi do instrukcji else '// W jakiś sposób nie znaleziono lokalnego kalendarza , błąd obsługi odpowiednio "Dlaczego nie otrzymuję lokalnego źródła? – user979331

+0

@ user979331 Alert jest normalny, musisz poprosić użytkownika o pozwolenie na używanie jego kalendarza Nie mam pojęcia, dlaczego nie byłoby lokalnych kalendarzy. kalendarze w ogóle w sourcesInEventStore? – JAL