【问题标题】:Maintaining Button State when App is Re-opened with Swift/Xcode使用 Swift/Xcode 重新打开应用程序时保持按钮状态
【发布时间】:2018-02-03 22:57:17
【问题描述】:

我是 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 部分中添加一些代码,但我无法弄清楚它应该是什么。

感谢您的帮助!

【问题讨论】:

  • 我建议在按钮状态发生变化时将数据保存在本地,因为一旦应用退出,您将丢失状态

标签: swift xcode


【解决方案1】:

我在 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) }
    }
}

然后在您的视图控制器中:

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。

【讨论】:

  • 执行此操作时出现的错误是“使用未解析的标识符 'button1'”,'button2' 也是如此
  • 当然,您必须将名称更改为您为 IBOutlet 提供的任何名称
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-18
  • 2014-06-24
相关资源
最近更新 更多