2015-06-15 2 views
1

Я пытаюсь создать новый календарь на OS X. Я не могу получить календарь (newcalendar), который будет отображаться в моем календаре. Я запускаю код, открываю календарь и не показываю. Кто-нибудь знает, почему? Вот что у меня в AppDelegate.swift:Новый EventKit EKCalendar не будет создан?

var store = EKEventStore() 

// creating the new calendar 
func getCalendar() -> EKCalendar? { 
    println("5") 
    let defaults = NSUserDefaults.standardUserDefaults() 

    if let id = defaults.stringForKey("calendarID") { 
     return store.calendarWithIdentifier(id) 
     println("6") 
     } 
    else { 
     var calendar = EKCalendar(forEntityType: EKEntityTypeEvent, eventStore: self.store) 
      println("6") 
     calendar.title = "newcalendar" 
     calendar.color = NSColor.brownColor() 
     calendar.source = self.store.defaultCalendarForNewEvents.source 

    println("7") 
    var error: NSError? 
    self.store.saveCalendar(calendar, commit: true, error: &error) 
    println("8") 

    if error == nil { 
     defaults.setObject(calendar.calendarIdentifier, forKey: "calendarID") 
    } 

    return calendar 
    println("9") 
    } 
} 


// Where it starts 
func applicationDidFinishLaunching(aNotification: NSNotification) { 
    println("1") 
var sema = dispatch_semaphore_create(0) 
var hasAccess = false 

// Ask for permission to access calendars 
store.requestAccessToEntityType(EKEntityTypeEvent, completion: { (granted:Bool, error:NSError?) in hasAccess = granted; dispatch_semaphore_signal(sema)}) 

//println("Permission to connect to Calendar = \(success); error? = \(error)") 
    println("2") 
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER) 
    println("3") 
    if (!hasAccess){ 
    } 
    else { 
     // returns an array of EKCalendars 
     var eventCalendars = 
     store.calendarsForEntityType(EKEntityTypeEvent) as [EKCalendar] 
     println("4") 
     // for each calendar in array, if the calendar is called newcalendar, 
     for i in eventCalendars { 
      if i.title == "newcalendar" { 
       println("newcalendar already exists") 
      } 
      else { 
       getCalendar() 
       break 
      } 
     } 
    } 
} //end of applicationDidFini... 
+0

Дело '! HasAccess' означает, что это провалилось! См. Мой отредактированный ответ. –

ответ

1

requestAccessToEntityType работает асинхронно в другом потоке. Вам нужно синхронизировать завершение с помощью семафора. Я делаю это вот так:

var sema = dispatch_semaphore_create(0) 
var hasAccess = false 

eventStore.requestAccessToEntityType(EKEntityTypeEvent, completion: { (granted:Bool, error:NSError?) in hasAccess = granted; dispatch_semaphore_signal(sema) }) 

dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER) 
if (!hasAccess) { 
    fatalError.... 
} 
// proceed normally 
+0

Я обновил свой код, но, похоже, он не исправил мою проблему с календарем, который не отображается. Это не видно. – Yelims01

+0

Вы пробовали использовать песочницу? –

+0

нет у меня нет. Я не знаю, как: S – Yelims01

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