Swift - Как установить начальное значение для NSUserDefaults
У меня есть переключатель под названием soundSwitch, я сохраняю состояние кнопки, используя пользовательское значение по умолчанию:
@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")
}
}
В настоящее время фактическое значение по умолчанию изначально ложно, когда пользователь впервые запускает приложение.
Как реализовать значения по умолчанию, чтобы они были истинными, если пользователь впервые запускает приложение, а они еще не настроены.
Я видел методы в Objective-C, но ничего в Swift. Из того, что я видел, вы можете сделать это в приложении делегат каким-то образом или в файле plist. Как мне сделать один из тех?
9 ответов
Пример синтаксиса Swift 3
Зарегистрируйте логическое значение по умолчанию:
UserDefaults.standard.register(defaults: ["SoundActive" : true])
И чтобы получить значение:
UserDefaults.standard.bool(forKey: "SoundActive")
Примечание: хотя приведенный выше код вернет true, обратите внимание, что значение на самом деле не записывается на диск, пока вы его не установите:
UserDefaults.standard.set(true, forKey: "SoundActive")
Добавьте это к вашему didFinishLaunchingWithOptions
метод из AppDelegate. Как отмечали некоторые другие, старайтесь не злоупотреблять, помещая все в этот метод.
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"
])
}
Swift 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.optionalInt(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()
}
Там нет ничего быстрого или конкретного делегата приложения.
Начальные значения по умолчанию устанавливаются путем вызова 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")
}
}
Общая версия того, как установить значение по умолчанию:
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) ?? ""
Если вы действительно хотите сделать это таким образом, поместите это в 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!
Поместите это в "didFinishLaunchingWithOptions" в вашем AppDelegate.
if defaults.valueForKey("launchedAlready") == true {
print("Not first launch.")
}
else {
defaults.setValue(true, forKey: "launchedAlready")
defaults.setBool(true, forKey: "SoundActive")
print("Sound ON")
}
Установите и активируйте звук.
var isSoundActivated: Bool {
get {
return defaults.bool(forKey: "SoundActive")
}
set {
defaults.set(newValue, forKey: "SoundActive")
defaults.synchronize()
}
}
Установить значение bool с помощью
isSoundActivated = true
проверить значение bool по
if isSoundActivated {
print("sound activated")
}