使用Swift / Xcode重新打开应用程序时维护按钮状态

时间:2018-02-03 14:00:07

标签: swift xcode

我是Swift和Xcode的新手,但我一直在这里阅读并在YouTube上观看视频,以指导我开始我的应用。一旦应用程序关闭并重新打开,我似乎无法通过按钮来保存其状态。我使用UserDefault To Save Button State作为示例,但是在它之后仍然没有保存按钮状态。

我使用Interface Builder设置状态,到目前为止还有以下代码:

@IBAction func ownedButton(_ sender UIButton) {

sender.isSelected = !sender.isSelected
UserDefaults.standard.set(sender.isSelected, forKey: "isSaved")
UserDefaults.standard.synchronize()
}

单击该按钮将保持选中状态,直到再次单击,因此它部分正常工作。看起来我需要在viewDidLoad部分中使用一些代码,但我无法弄清楚它应该是什么。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我的Objective-C时代的习惯是在UserDefaults中围绕属性编写一个包装器。这样,一切都是编译时检查的,并且字符串作为键的使用被最小化:

// Properties.swift
import Foundation

fileprivate var standardDefaults = UserDefaults.standard

class Properties {
    static func registerDefaults() {
        standardDefaults.register(defaults: [
            kIsButton1Selected: false,
            kIsButton2Selected: true
        ])
    }

    fileprivate static let kIsButton1Selected = "isButton1Selected"
    static var isButton1Selected: Bool {
        get { return standardDefaults.value(forKey: kIsButton1Selected) as! Bool }
        set { standardDefaults.set(newValue, forKey: kIsButton1Selected) }
    }

    fileprivate static let kIsButton2Selected = "isButton2Selected"
    static var isButton2Selected: Bool {
        get { return standardDefaults.value(forKey: kIsButton2Selected) as! Bool }
        set { standardDefaults.set(newValue, forKey: kIsButton2Selected) }
    }
}

然后在您的View Controller中:

override func viewDidLoad() {
    // Always call registerDefaults before you use UserDefaults
    // for the first time in your app
    Properties.registerDefaults()
    button1.isSelected = Properties.isButton1Selected
    button2.isSelected = Properties.isButton2Selected
}

@IBAction func ownedButton(_ sender: UIButton) {
    sender.isSelected = !sender.isSelected

    switch sender {
    case button1:
        Properties.isButton1Selected = sender.isSelected
    case button2:
        Properties.isButton2Selected = sender.isSelected
    default:
        break
    }
}

您可以使用键值观察替换switch,但请记住在deinit上删除KVO。