gpt4 book ai didi

swift - 在另一个 ViewController Swift Xcode 中调用时 bool 值设置为 false

转载 作者:行者123 更新时间:2023-11-28 14:52:12 24 4
gpt4 key购买 nike

我正在尝试从 AppDelegate 内的一个 ViewController 访问 bool 值。但是当我这样做时,它会打印 false,尽管我希望它设置为 true。

这是我的代码:我在 ViewWillAppear() 之外声明了这个变量

  var mainIsON = Bool()
//...
@IBAction func mainSwitchState(_ sender: UISwitch) {
if mainSwitch.isOn{
mainIsON = true
}
}

然后我想像这样在 AppDelegate 中检查它。我像这样声明一个对象以访问 AppDelegate 顶部的 SettingsViewController:

 let settings = SettingsViewController()
//...
func application(_ application: UIApplication,
didReceiveRemoteNotification userInfo: [AnyHashable : Any],
fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
print("received silent push notification")
if settings.mainIsON == true {
LocalPushManager.shared.sendLocalPushRepeating(in: 60, plant: 1)
}
// LocalPushManager.shared.sendLocalPushRepeating(in: <#T##TimeInterval#>, plant: )
completionHandler(UIBackgroundFetchResult.newData)
}

但是代码只是被跳过了,当我运行调试器时,我发现 mainIsON 是错误的。我做错了什么?

最佳答案

问题实际上在你的行中

let settings = SettingsViewController() //in AppDelegate 

当你写这一行时,它实际上创建了一个新的 SettingView Controller 实例

当控制到达时创建一个新实例

var mainIsON = Bool()

您的 mainIsON bool 再次被分配并且它的默认值为 False 这就是您面临上述问题的原因

解决方案:使用结构

struct settingBool {
static var mainIsON:Bool=False /// Setting Default as False
}

现在在 SettingViewController 中

@IBAction func mainSwitchState(_ sender: UISwitch) {
if mainSwitch.isOn{
settingBool.mainIsON = true
}
}

在 AppDelegate 中

func application(_ application: UIApplication,
didReceiveRemoteNotification userInfo: [AnyHashable : Any],
fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
print("received silent push notification")
if settingBool.mainIsON == true {
LocalPushManager.shared.sendLocalPushRepeating(in: 60, plant: 1)
}
// LocalPushManager.shared.sendLocalPushRepeating(in: <#T##TimeInterval#>, plant: )
completionHandler(UIBackgroundFetchResult.newData)
}

解决方案 2 - 使用 AppDelegate ItSelf:不推荐 在 App Delegate 本身创建一个 Bool 变量

var mainISOn : Bool = false

并且像访问它一样访问它

let appDel = UIApplication.shared.delegate as! AppDelegate
appDel.mainISOn = false

支票会像

@IBAction func mainSwitchState(_ sender: UISwitch) {
if mainSwitch.isOn{
let appDel = UIApplication.shared.delegate as! AppDelegate
appDel.mainIsON = true
}
}

现在在 AppDelegate 中

func application(_ application: UIApplication,
didReceiveRemoteNotification userInfo: [AnyHashable : Any],
fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
print("received silent push notification")
if self.mainIsON == true {
LocalPushManager.shared.sendLocalPushRepeating(in: 60, plant: 1)
}
// LocalPushManager.shared.sendLocalPushRepeating(in: <#T##TimeInterval#>, plant: )
completionHandler(UIBackgroundFetchResult.newData)
}

关于swift - 在另一个 ViewController Swift Xcode 中调用时 bool 值设置为 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49745111/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com