2017-02-17 2 views
1

Ich habe diesen seltsamen Bug. Ich habe eine globale BoolCalendarAccess genannt:Swift Bool ändert sich von selbst

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

Wie Sie sehen können, habe ich einen Setter und Getter für sie gemacht, so konnte ich einen Haltepunkt setzen, um zu sehen, wo es eingestellt wird. Ich tat das und jedes Mal, wenn ich den Haltepunkt traf, ist der Wert true. Ich bin mir sicher, dass ich die _CalendarAccess nie direkt gesetzt habe, weil diese Variable bis jetzt nur CalendarAccess genannt wurde.

Aber wenn ich folgendes in einem View-Controller mache, ist 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.") 
    } 
} 

Ich habe keine Ahnung, wie das überhaupt möglich ist - die Variable eine globale ist, die nichts mit einer beliebigen Ansicht oder Controller zu tun haben.

Der Controller, aus dem der letzte Codeblock stammt, wird modal dargestellt, wenn diese Information überhaupt nützlich ist.

EDIT:CalendarAccess wird nur an einer Stelle (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 
} 

EDIT: ich diese Nachrichten, wenn ich die Taste tippen, die die @IBAction func saveEvent ruft:

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. 

EDIT: Wenn ich den modal präsentiert View Controller (der mit der saveEvent func) und log den Wert von CalendarAccess, es ist wieder wahr. Und der Setter Breakpoint wird nicht getroffen.

EDIT: Es scheint wie der Wert von _CalendarAccess geht auf den Anfangswert zurück, wenn ich den VC präsentiere. Wenn ich var _CalendarAccess = false zu var _CalendarAccess = true ändere, ist es wahr, wenn der VC präsentiert wird. Auch die Calendar Variable ist nil, wenn die VC präsentiert wird, aber nicht anders.

+1

Was * genau * lässt dich denken, dass '_CalendarAccess' wahr wird? Können Sie ein (minimales) * in sich geschlossenes * Beispiel zur Demonstration des Problems veröffentlichen? Wird der Breakpoint in der Setter-Methode getroffen? Wenn ja - was ist der Call-Stack? Vielleicht ist es nur Debugger Müll anzuzeigen? Fügen Sie '' print (_CalendarAccess) '' sowohl zum Setzen als auch zum Getter hinzu. –

+0

Also habe ich einen 'print (_CalendarAccess)' unterhalb der Zeile '_CalendarAccess = true' hinzugefügt. Das gibt 'true' aus, bevor die Funktion' saveEvent' aufgerufen wird. Trotzdem bekomme ich die Fehlermeldung. – edvinHolm

+0

Ihr Code in func saveEvent fragt CalenderAccess ab. Der Getter gibt den Wert von _CalendarAccess zurück, den Sie auf false festgelegt haben. Wenn Sie _CalendarAccess nicht auf "True" setzen, wird immer "False" zurückgegeben. – Magnas

Antwort

2

Das Projekt hatte ein gleichnamiges Framework, was dazu führte, dass der Compiler an mehreren Stellen nach denselben Werten suchte. Remove framework, Problem gelöst :)

Verwandte Themen