2017-02-17 32 views
1

我有这个奇怪的错误。我有一个全球性的Bool称为CalendarAccessSwift布尔本身的变化

var EventStore: EKEventStore! 
var Calendar: NSCalendar! 
var CalendarAccessRequestComplete = false 
var _CalendarAccess = false 
var CalendarAccess: Bool { 
    set(value) 
    { 
     _CalendarAccess = value; 
    } 
    get { 
     return _CalendarAccess; 
    } 
} 

正如你所看到的,我做了一个setter和getter方法,所以我可以把一个断点,看看它正在建立。我做到了这一点,每次我碰到断点时,值都是true。我确定我从来没有直接设置_CalendarAccess,因为直到现在,这个变量只被称为CalendarAccess

但是,当我在视图控制器中执行以下操作时,CalendarAccessfalse

@IBAction func saveEvent(_ sender: Any) { 

    if(CalendarAccess) 
    { 
     let event = EKEvent(eventStore: EventStore) 
     event.title = "My Event" 
     event.startDate = Date(); 
     event.endDate = Calendar.date(byAdding: .hour, value: 1, to: Date(), options: .matchFirst)! 
     event.notes = "A note" 
     event.calendar = EventStore.defaultCalendarForNewEvents 
     do 
     { 
      try EventStore.save(event, span: .thisEvent) 
     } catch 
     { 
      print("Unable to save event") 
     } 
    } 
    else 
    { 
     ErrorAlert(title: "No calendar access", text: "Please give the app access to your calendar. You can do that in your iOS device's settings.") 
    } 
} 

我不知道如何这甚至是可能的 - 该变量是一个全球性的,不具有任何与任何视图或控制器。

如果该信息完全有用,则模态地呈现控制器的最后一个代码块。

编辑:CalendarAccess设置只在一个地方(AppDelegate中):

func updateCalendarAccess() 
{ 
    Calendar = NSCalendar.current as NSCalendar! 
    CalendarAccessRequestComplete = false 

    EventStore = EKEventStore() 
    EventStore.requestAccess(to: .event, completion: { 
     (access: Bool, e: Error?) in 

     CalendarAccessRequestComplete = true 

     CalendarAccess = access; 

     return 

    }) 

    while(!CalendarAccessRequestComplete) { } 
} 

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool { 

    // Override point for customization after application launch. 

    updateCalendarAccess() 

    return true 
} 

编辑:

2017-02-17 13:58:00.980237 Calendar[16695:5163026] [MC] System group container for systemgroup.com.apple.configurationprofiles path is /private/var/containers/Shared/SystemGroup/systemgroup.com.apple.configurationprofiles 
2017-02-17 13:58:00.989165 Calendar[16695:5163026] [MC] Reading from public effective user settings. 
当我点击调用 @IBAction func saveEvent按钮我得到这些消息

编辑:当我解雇模态提出的视图控制器(与一个函数)并记录CalendarAccess的值,这是真的。并且setter断点未被命中。

编辑:看来,当我提出VC时,_CalendarAccess的值可以回到初始值。如果我将var _CalendarAccess = false更改为var _CalendarAccess = true,那么VC呈现时就是这样。此外,当呈现VC时,Calendar变量是nil,但是否则不是。

+1

什么*确切*让你认为'_CalendarAccess'成为现实?你能发表一个(最小的)*自包含的例子来证明问题吗? setter方法中的断点是否被击中?如果是 - 什么是调用堆栈?也许它只是调试器显示垃圾?向setter和getter添加'print(_CalendarAccess)'。 –

+0

所以我在'_CalendarAccess = true'行下面加了一个'print(_CalendarAccess)'。在调用saveEvent函数之前一次输出'true'。但是,我仍然收到错误警报。 – edvinHolm

+0

您在func saveEvent中的代码询问CalenderAccess。 getter返回您设置为false的_CalendarAccess的值。除非你真的将_CalendarAccess设置为true,否则它总是返回false。 – Magnas

回答

2

项目包含相同名称的框架,导致编译器在多个地方查找相同的值。删除框架,解决问题:)