【问题标题】:Save UISwitch state in UserDefaults在 UserDefaults 中保存 UISwitch 状态
【发布时间】:2018-10-25 13:43:15
【问题描述】:

我想用 UserDefaults 保存 UISwitch 标签的状态。我的代码如下所示:

func viewDidAppear() {
    mySwitch.setOn(userDefaults.standard.bool(forKey: "mySwitchValue"), animated: true)
}

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

但在应用程序中,当我离开切换视图并返回时,UISwitch 不是我转动它的样子。

【问题讨论】:

  • 您的viewWillDesappear 方法不太可能被调用,因为它拼写错误。应该是viewWillDisappear。如果这是一个视图控制器类,你还需要 override 来实现这些功能,你应该调用 super
  • 您的代码看起来不错。你能检查一下代码库中的其他地方是否影响了相同的 keyString 吗?或者,开关是否也受到代码库中其他地方的影响?
  • 锰:不,其他地方没有影响..
  • rmaddy :我认为这是可能的,但是当我尝试覆盖时,据说我无法从它的 superdlass 或类似的东西中覆盖一个函数
  • 这些方法属于什么类?他们真的被召唤了吗?

标签: ios swift nsuserdefaults uiswitch


【解决方案1】:

这不是对您原始查询的回答,而是对评论中另一个查询的回答。 问题:如果应用程序是第一次启动,如何设置UISwitch的默认状态为on? 虽然理想情况下,它应该作为另一个问题提出,因为它是增量的,代码如下:

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
    }

【讨论】:

    【解决方案2】:

    可能,rmaddy 之前指出的就是问题所在。在那种情况下,就去拼写吧。

    否则,当视图消失时设置开关状态的值可能不是一个明智的选择。当应用程序进入后台时,其他进程会同时执行,并且在应用程序关闭之前可能不会影响设置默认值。

    我通常会在调用此类函数时设置此类值,即在 switch 操作中。一旦用户改变开关状态,保存在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")
        }
    }
    

    下面的演示:

    【讨论】:

    • 谢谢!我会尽快尝试的!
    • Yeeees 我刚试过,它工作!谢谢 !您知道如何将默认状态设置为“开”吗?如果我删除应用程序并重建,切换器默认为关闭。
    • 您可以简单地添加一个布尔变量为“true”,并在应用程序首次启动时使用布尔变量实例化您的 UISwitch 的状态(您可以使用另一个变量来确定应用程序是否首次启动)。首次启动后,默认应该是从 UserDefaults.standard 加载状态
    • 如果对您有用,请“接受”相关答案作为已接受的答案。您可以通过单击已接受答案左侧的勾号来做到这一点。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2016-07-24
    • 1970-01-01
    • 2011-10-03
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多