在UserDefaults中保存UISwitch状态

3
我希望能够使用UserDefaults保存UISwitch标签的状态。我的代码如下:
func viewDidAppear() {
    mySwitch.setOn(userDefaults.standard.bool(forKey: "mySwitchValue"), animated: true)
}

func viewWillDesappear() {
    UserDefaults.standard.set(mySwitch.isOn, forKey: "mySwitchValue")
}

但是在应用程序中,当我离开开关视图,再返回时,UISwitch的状态并不是我之前选择的状态。


2
由于拼写错误,你的 viewWillDesappear 方法很可能不会被调用。正确的拼写应该是 viewWillDisappear。如果这是一个视图控制器类,你还需要为这些函数添加 override 关键字,并且应该调用 super - rmaddy
你的代码看起来没问题。你能检查一下是否在代码库中其他地方也有影响同一个keyString的代码吗?或者,是否还有其他地方会影响到这个switch语句呢? - Manganese
锰:不,它们没有在其他地方受到影响。 - lfalkau
rmaddy: 我认为这是可能的,但当我尝试覆盖时,它说我不能覆盖其超类中的函数或类似的东西。 - lfalkau
这些方法在哪个类中?它们实际上被调用了吗? - rmaddy
2个回答

2

可能,rmaddy之前指出的是问题所在。在这种情况下,可以考虑拼写检查。

否则,当视图消失时设置开关状态的值可能不是一个明智的选择。因为当应用程序进入后台时,其他进程也会被处理,可能在应用程序关闭之前没有生效默认设置。

通常我会在调用此类函数时设置这些值,即在开关操作中。当用户更改开关状态时,立即将其保存在defaults中,这样当您在viewDidAppear中检索它时,它将起作用。

import UIKit

class ViewController: UIViewController {

    let userDefaults = UserDefaults.standard

    @IBOutlet weak var mySwitch: UISwitch!

    @IBAction func switchAction(_ sender: UISwitch) {
        userDefaults.set(sender.isOn, forKey: "mySwitchValue")
    }

    override func viewDidAppear(_ animated: Bool) {
        mySwitch.isOn = userDefaults.bool(forKey: "mySwitchValue")
    }
}

Demo below:

enter image description here


谢谢!我会尽快尝试! - lfalkau
1
是的,我刚试了一下,它可以工作!谢谢!你知道如何将默认状态设置为“开”吗?如果我删除应用程序并重新构建,则开关默认处于关闭状态。 - lfalkau
你可以简单地添加一个布尔变量作为“true”,并在应用程序首次启动时使用布尔变量实例化UISwitch的状态(您可以使用另一个变量来确定应用程序是否是首次启动)。首次启动后,默认应该从UserDefaults.standard加载状态。 - Manganese
如果回答对您有帮助,请将其标记为“已接受的答案”。您可以通过点击已接受答案左侧的勾号来完成。谢谢。 - Manganese

0

这不是对您原始查询的答案,而是对评论中另一个查询的答案。问题:如果应用程序是第一次启动,如何将UISwitch的默认状态设置为打开? 虽然理想情况下,它应该被视为另一个问题,但鉴于它是增量的,以下是代码:

import UIKit

class ViewController: UIViewController {

    let userDefaults = UserDefaults.standard

    var firstTimeAppLaunch: Bool {
        get {
            // Will return false when the key is not set.
            return userDefaults.bool(forKey: "firstTimeAppLaunch")
        }
        set {}
    }

    @IBOutlet weak var mySwitch: UISwitch!

    @IBAction func switchAction(_ sender: UISwitch) {
        userDefaults.set(sender.isOn, forKey: "mySwitchValue")
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        if !firstTimeAppLaunch {
            // This will only be trigger first time the application is launched.
            userDefaults.set(true, forKey: "firstTimeAppLaunch")
            userDefaults.set(true, forKey: "mySwitchValue")
        }

        // Do any additional setup after loading the view, typically from a nib.
    }

    override func viewDidAppear(_ animated: Bool) {
        mySwitch.isOn = userDefaults.bool(forKey: "mySwitchValue")
    }

}

请注意,您可以在AppDelegate的函数中执行此操作:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Could add the above code within this as well. Upto you. 
        return true
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接