我有一个名为
soundSwitch
的开关,我使用 UserDefault
保存按钮的状态,如下所示:
@IBAction func soundsChanged(sender: AnyObject) {
if soundSwitch.on {
defaults.setBool(true, forKey: "SoundActive")
print("Sound ON")
} else {
defaults.setBool(false, forKey: "SoundActive")
print("Sound OFF")
}
}
目前,当用户首次启动应用程序时,实际默认值最初为 false。
如果用户启动应用程序并且尚未配置它们,我如何将默认值实现为 true。
我见过 Objective-C 中的方法,但没有见过 Swift 中的方法。据我所知,您可以以某种方式在应用程序委托中或在 plist 文件中执行此操作。我该如何做其中一个?
Swift 3 语法示例
注册一个布尔默认值:
UserDefaults.standard.register(defaults: ["SoundActive" : true])
并获取值:
UserDefaults.standard.bool(forKey: "SoundActive")
旁注:虽然上面的代码将返回 true,但请注意,在您设置之前,该值实际上并未写入磁盘:
UserDefaults.standard.set(true, forKey: "SoundActive")
将此添加到 AppDelegate 中的
didFinishLaunchingWithOptions
方法中。正如其他一些人指出的那样,尽量不要将所有内容都放入此方法中来滥用。
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
/// Here you can give default values to your UserDefault keys
UserDefaults.standard.register(defaults: [
"SoundActive": true,
"someOtherKey": "Some Message"
])
}
斯威夫特4
我更喜欢实现一个类似于
UserDefaults.string(forKey: )
的函数,如果未设置值,则返回 nil
。结合??运算符,您不需要将任何默认值写入磁盘,除非您稍后明确设置它们。
extension UserDefaults {
public func optionalInt(forKey defaultName: String) -> Int? {
let defaults = self
if let value = defaults.value(forKey: defaultName) {
return value as? Int
}
return nil
}
public func optionalBool(forKey defaultName: String) -> Bool? {
let defaults = self
if let value = defaults.value(forKey: defaultName) {
return value as? Bool
}
return nil
}
}
然后您可以按如下方式检索默认值
let defaults = UserDefaults.standard
let userName = defaults.string(forKey: "Username") ?? "Happy"
let userAge = defaults.optionalInt(forKey: "Age") ?? 21
let isSmart = defaults.optionalBool(forKey: "Smart") ?? true
使用“registerDefaults”您可以设置 NSUserDefaults 的默认值
let userDefaultsDefaults = [
"SoundActive" : true
]
NSUserDefaults.standardUserDefaults().registerDefaults(userDefaultsDefaults)
注意:将其写入didFinishLaunchingWithOptions中,因此设置了默认值。
在您要检查的地方写下以下代码
let onoroff = NSUserDefaults.standardUserDefaults().objectForKey("SoundActive") as! Bool!
if (onoroff != nil && onoroff == false)
{
self.checkForAgreement()
}
没有任何 swift 或应用程序委托特定的内容。
初始默认值是通过在
registerDefaults:
实例上调用 standardUserDefaults
来设置的。
您可以多次进行此调用,我建议您不要在应用程序委托中执行此操作,而是在应用程序中的适当时间注册适当的详细信息,因此如果您有 1 个使用某些默认值的视图控制器/子系统然后将默认值注册为初始化的一部分(如果该代码)。
只有当您有代码的多个不同部分使用的东西时,您才应该考虑在应用程序委托中执行此操作,并且只有当您没有其他合适的控制器来执行此操作时。
func lastStatus() -> Bool {
let defaultValue = true
if let value = default.valueForKey("SoundActive") {
// then use it
return value as? Bool ?? defaultValue
} else {
// oh, no value?
return defaultValue
}
}
我认为这是最好的使用方式。另外
register(defaults:)
也会有所帮助,但在文档中,Apple 建议将其用作 fallback
,例如分离 no value
和 default value
的情况。看你的需要了。
您可以将所有
UserDefaults
逻辑封装到一个属性变量中,该变量会自动注册应用程序默认值并将任何更新保存回用户默认值字典中。如果应用程序的其他部分(除了开关控件)也读取或更改此状态,这会特别方便。
Swift 5 — 第一部分执行闭包来初始化属性,第二部分是
didSet
块,每当属性更改时都会自动调用该块。
var soundIsActive: Bool = {
// Register the app default:
UserDefaults.standard.register(defaults: ["SoundActive" : true])
// Initialize the property with the current user default:
return UserDefaults.standard.bool(forKey: "SoundActive")
}()
{
didSet {
// Update user default when the variable is set:
UserDefaults.standard.set(soundIsActive, forKey: "SoundActive")
}
}
Bool、Int、Double 等标量类型会给出默认值。获得可选的使用对象。
你可以试试这个。还可以添加默认值,如下面第二种情况:
extension UserDefaults {
private enum Keys {
static let soundActiveOptional = "soundActiveOptional"
static let soundActiveDefaultTrue = "soundActiveDefaultTrue"
static let doubleValue = "doubleValue"
}
var soundActiveOptional: Bool? {
get {
return UserDefaults.standard.object(forKey: Keys.soundActiveOptional) as? Bool
}
set {
UserDefaults.standard.set(newValue, forKey: Keys.soundActiveOptional)
}
}
var soundActiveDefaultTrue: Bool {
get {
return UserDefaults.standard.object(forKey: Keys.soundActiveDefaultTrue) as? Bool ?? true
}
set {
UserDefaults.standard.set(newValue, forKey: Keys.soundActiveDefaultTrue)
}
}
var doubleValue: Double {
get {
return UserDefaults.standard.object(forKey: Keys.doubleValue) as? Double ?? 0.1
}
set {
UserDefaults.standard.set(newValue, forKey: Keys.doubleValue)
}
}
}
如果你真的想这样做,请将其放入AppDelegate中:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
let defaults = NSUserDefaults.standardUserDefaults()
if defaults.valueForKey("SoundActive") == nil {
defaults.setBool(true, forKey: "SoundActive")
}
如果只是在一个viewcontroller中使用,可以考虑将代码放在viewDidLoad方法中!
如何设置默认值的通用版本:
enum UserDefaultsKeys: String {
case username = "kUsername"
}
extension UserDefaults {
func optionalValue<T>(forKey key: UserDefaultsKeys) -> T? {
if let value = self.value(forKey: key.rawValue) {
return value as? T
}
return nil
}
}
let username = defaults.optionalValue(forKey: .username) ?? ""
Swift 5 更新
在 AppDelegate 的“didFinishLaunchingWithOptions”中设置布尔值,如下所示...
//Assumiing you have made a singleton for Userdefaults
public let defaults = UserDefaults.standard
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
defaults.set(true, forKey: "SoundActive")
//boiler plate code ...
}