【发布时间】:2017-02-17 12:16:11
【问题描述】:
我有这个奇怪的错误。我有一个名为CalendarAccess 的全局Bool:
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。
但是,当我在视图控制器中执行以下操作时,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.")
}
}
我不知道这怎么可能——变量是一个全局变量,与任何视图或控制器都没有任何关系。
最后一个代码块来自的控制器以模态方式呈现,如果该信息有用的话。
编辑: 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
}
编辑:我在点击调用@IBAction func saveEvent的按钮时收到这些消息:
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.
编辑:当我关闭模态显示的视图控制器(具有saveEvent 函数的那个)并记录CalendarAccess 的值时,它又是真的。并且 setter 断点没有命中。
编辑:当我展示 VC 时,_CalendarAccess 的值似乎回到了初始值。如果我将var _CalendarAccess = false 更改为var _CalendarAccess = true,那么当VC 出现时它是正确的。此外,当 VC 出现时,Calendar 变量是 nil,否则不是。
【问题讨论】:
-
是什么确切地让您认为
_CalendarAccess变成了真的?您可以发布一个(最小的)self-contained 示例来演示该问题吗? setter 方法中的断点是否命中?如果是——调用堆栈是什么?也许它只是调试器显示垃圾?将print(_CalendarAccess)添加到 setter 和 getter。 -
所以我在
_CalendarAccess = true行下方添加了print(_CalendarAccess)。在调用saveEvent函数之前打印一次true。但是,我仍然收到错误警报。 -
您在 func saveEvent 中的代码询问 CalenderAccess。 getter 返回您设置为 false 的 _CalendarAccess 的值。除非您实际上将 _CalendarAccess 设置为 true,否则它将始终返回 false。
-
@Magnas,我确实设置了
CalendarAccess。 -
@edvinHolm:我在你的代码中看不到
_CalendarAccess = true...请看看如何创建minimal reproducible example,即我们可以的一些代码编译并重现问题。
标签: ios swift cocoa-touch uiviewcontroller eventkit