Swift bool 自行更改

Posted

技术标签:

【中文标题】Swift bool 自行更改【英文标题】:Swift bool changes by itself 【发布时间】: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

但是,当我在视图控制器中执行以下操作时,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

编辑:我在点击调用@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,即我们可以的一些代码编译并重现问题。 【参考方案1】:

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

【讨论】:

以上是关于Swift bool 自行更改的主要内容,如果未能解决你的问题,请参考以下文章

尝试更改 Bool 属性时出现 EXC_BAD_ACCESS 错误

swift xcode更改状态栏(背景颜色)

如何使用 swift 在特定视图中更改状态栏颜色?

图像文件更改后在 Swift 中刷新 UIImageView

新项目成功运行后立即出现完整项目 Swift 编译错误

在QML中更改数组中bool的颜色