Ich habe diesen seltsamen Bug. Ich habe eine globale Bool
CalendarAccess
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 CalendarAccess
false
!
@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.
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. –
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
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