可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I have a switch called soundSwitch, I am saving the state of the button using an user default as such:
@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")
}
}
Currently the actual defaults value is initially false when the user first launches the application.
How do I implement the defaults to be true if the user is first launching the app and it they haven't been configured yet.
I have seen methods in Objective-C, but nothing in Swift. From what I have seen you can do it in the app delegate some how, or in a plist file. How do I do either of those ones?
回答1:
Swift 3 syntax example
Register a boolean default value:
UserDefaults.standard.register(defaults: ["SoundActive" : true])
And to get the value:
UserDefaults.standard.bool(forKey: "SoundActive")
Sidenote: Although the above code will return true, note that the value isn't actually written to disk until you set it:
UserDefaults.standard.set(true, forKey: "SoundActive")
回答2:
Add this to your didFinishLaunchingWithOptions
method from the AppDelegate. As some others pointed out try not to abuse by putting everything in this method.
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"
])
}
回答3:
Using "registerDefaults" you can set Default value of NSUserDefaults
let userDefaultsDefaults = [
"SoundActive" : true
]
NSUserDefaults.standardUserDefaults().registerDefaults(userDefaultsDefaults)
Note: write this in didFinishLaunchingWithOptions, so default value is set.
write below code where you want to check
let onoroff = NSUserDefaults.standardUserDefaults().objectForKey("SoundActive") as! Bool!
if (onoroff != nil && onoroff == false)
{
self.checkForAgreement()
}
回答4:
There is nothing swift or app delegate specific.
Initial defaults are set by calling registerDefaults:
on the standardUserDefaults
instance.
You can make this call multiple times and I'd recommend that you don't do it in the app delegate, instead register appropriate details at appropriate times in the app, so if you have 1 view controller / subsystem which uses certain defaults values then register the default values as part of the initialisation if that code.
Only if you have something which is used by multiple different parts of the code should you consider doing that in the app delegate, and then only if you don't have some other appropriate controller in which to do it.
回答5:
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
}
}
I think this is best way of using it. Also register(defaults:)
will help, but in documentation Apple suggest to using it as fallback
, like separating situation of no value
and default value
. Depend on your need.
回答6:
If you really want to do it this way, put this in the AppDelegate:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
let defaults = NSUserDefaults.standardUserDefaults()
if defaults.valueForKey("SoundActive") == nil {
defaults.setBool(true, forKey: "SoundActive")
}
If it is just used in the one viewcontroller, consider putting the code in the viewDidLoad method instead!
回答7:
Swift 4
I prefer to implement a function similar to UserDefaults.string(forKey: ) which returns nil if the value is not set. Combined with the ?? operator, you don't need to have any default values written to disk unless you explicitly set them later.
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
}
}
Then you can retrieve your default values as follows
let defaults = UserDefaults.standard
let userName = defaults.string(forKey: "Username") ?? "Happy"
let userAge = defaults.optionalInt(forKey: "Age") ?? 21
let isSmart = defaults.optionalInt(forKey: "Smart") ?? true
回答8:
Put this in your "didFinishLaunchingWithOptions" in your AppDelegate.
if defaults.valueForKey("launchedAlready") == true {
print("Not first launch.")
}
else {
defaults.setValue(true, forKey: "launchedAlready")
defaults.setBool(true, forKey: "SoundActive")
print("Sound ON")
}
回答9:
Set and get sound activated.
var isSoundActivated: Bool {
get {
return defaults.bool(forKey: "SoundActive")
}
set {
defaults.set(newValue, forKey: "SoundActive")
defaults.synchronize()
}
}
Set bool value by
isSoundActivated = true
check bool value by
if isSoundActivated {
print("sound activated")
}