web-dev-qa-db-ja.com

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")
        }
    }

現在、ユーザーが最初にアプリケーションを起動したとき、実際のデフォルト値は最初はfalseです。

ユーザーが最初にアプリを起動していて、まだ構成されていない場合にデフォルトをtrueに実装するにはどうすればよいですか。

Objective-Cでメソッドを見ましたが、Swiftでは何も見ませんでした。私が見たものから、あなたはアプリのデリゲートやplistファイルでそれを行うことができます。これらのいずれかを行うにはどうすればよいですか?

32

Swift 3の構文例

ブールのデフォルト値を登録します。

UserDefaults.standard.register(defaults: ["SoundActive" : true])

そしてgetの値:

UserDefaults.standard.bool(forKey: "SoundActive")

サイドノート:上記のコードはtrueを返しますが、値は実際にはディスクに書き込まれないことに注意してくださいset it:

UserDefaults.standard.set(true, forKey: "SoundActive")
55
Novi

これを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"
        ])
}
17
fs_tigre

「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()
 }
7
Hardik Thakkar

Swiftまたはアプリデリゲート固有のものはありません。

初期デフォルトは、standardUserDefaultsインスタンスでregisterDefaults:を呼び出すことで設定されます。

この呼び出しは複数回行うことができますが、アプリのデリゲートでは実行せず、代わりにアプリで適切な時間に適切な詳細を登録することをお勧めします。そのため、特定のデフォルト値を使用する1つのView Controller/Subsystemがある場合そのコードの場合、初期化の一部としてデフォルト値を登録します。

コードの複数の異なる部分で使用されるものがある場合にのみ、アプリデリゲートでそれを行うことを検討する必要があります。また、他の適切なコントローラーがない場合に限ります。

4
Wain

Swift 4

値が設定されていない場合にnilを返すUserDefaults.string(forKey:)のような関数を実装することを好みます。 ??と組み合わせて演算子を使用すると、後で明示的に設定しない限り、ディスクにデフォルト値を書き込む必要はありません。

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
4
Guy Brooker
_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は、_no value_と_default value_の状況を分離するように、fallbackとして使用することを提案します。必要に応じて。

2
Klein Mioke

本当にこの方法でやりたい場合は、これをAppDelegateに入れてください。

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    let defaults = NSUserDefaults.standardUserDefaults()
    if defaults.valueForKey("SoundActive") == nil {
        defaults.setBool(true, forKey: "SoundActive")
    }

1つのViewControllerでのみ使用される場合は、代わりにviewDidLoadメソッドにコードを配置することを検討してください。

0
Dominic