ios - Swift bool 自己改变

标签 ios swift cocoa-touch uiviewcontroller eventkit

我有一个奇怪的错误。我有一个名为 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

但是,当我在 View Controller 中执行以下操作时,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.")
    }
}

我什至不知道这怎么可能 - 该变量是一个全局变量,与任何 View 或 Controller 都没有任何关系。

最后一个代码块来自的 Controller 以模态方式呈现,如果该信息完全有用的话。

编辑 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.

编辑:当我关闭模态呈现的 View Controller (带有 saveEvent 函数的 View Controller )并记录 CalendarAccess 的值时,它是再次真实。并且未命中 setter 断点。

编辑: 当我显示 VC 时,_CalendarAccess 的值似乎回到了初始值。如果我将 var _CalendarAccess = false 更改为 var _CalendarAccess = true,则在显示 VC 时为 true。此外,当出现 VC 时,Calendar 变量为 nil,否则不会。

最佳答案

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

关于ios - Swift bool 自己改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42297741/

相关文章:

iphone - 如何从 iOS 中的 UIMenuController 中删除默认的 UIMenuItem?

ios - 将 arkit 快照直接保存到照片库 swift 4

iphone - 将文件从包复制到文档不起作用(Cocoa 错误 512)

cocoa-touch - 是否有带有标签和文本字段的可重用 UITableViewCell?

ios - Swift – 关闭 View Controller 后 TableView 数据未重新加载

ios - 实现PFQueryTableViewController搜索功能

ios - 如何在 UICollectionViewCell 中使用详细信息披露按钮?

ios - 对可选属性感到困惑——如何更好地编写这段代码?

swift - 在 swift 中覆盖具有 void 类型 T 的泛型方法会导致编译器出现段错误

ios - 你如何真正从 UIMenuController 中删除 Copy