web-dev-qa-db-ja.com

Swift 4設定バンドル、デフォルトを取得

約8個のトグルスイッチを含む設定バンドルを作成しました。私がやろうとしていることは、設定バンドルからデフォルト値を取得することです。現在、私はこれら2つの方法を持っています:

func registerSettingsBundle(){
        let appDefaults = [String:AnyObject]()
        UserDefaults.standard.register(defaults: appDefaults)
        UserDefaults.standard.synchronize()
    }

    func updateDisplayFromDefaults(){
        let defaults = UserDefaults.standard
        let update_lot = defaults.bool(forKey: "update_lot")
        print(update_lot)
    }

私は自分のviewDidLoadでこれらのメソッドを呼び出しています

override func viewDidLoad() {
        super.viewDidLoad()
        registerSettingsBundle()
        updateDisplayFromDefaults()
    }

ただし、これではデフォルト値は取得されません(すべてtrueですが、すべてfalseを返します)。これは機能し、アプリを閉じて設定を開き、設定を調整してアプリを再度開くと、正しい値が得られます。デフォルト設定を取得する必要はありませんか?私はplistを読む方法を取りましたが、設定バンドルの設定を変更すると、有効になりません。

7
user979331

これは私にデフォルト値を取得しません(すべて真ですが、すべて偽を返します)

設定バンドルでONと表示されるトグルスイッチがあり、バンドルを読み取るとすべてのfalse値が表示されるようです。

これに該当する場合は、ここで何か不足しています。

Bundle(Root.plist)の設定では、 "Default Value"フィールドがあり、トグルスイッチの実際のデフォルト値とは関係ありません。これは、切り替える視覚的なインジケータにすぎません。 plistで「デフォルト値」が「YES」に設定されている可能性がありますが、値を読み取ろうとするとfalseになります。

enter image description here

ここでは、Root.plistのリマインダーのデフォルト値[〜#〜] yes [〜#〜]およびforUpdate[〜#〜] no [〜#〜]したがって、アプリの起動時に上記のように表示されます。

しかし、私がこれらのデフォルトを読み込もうとしたとき-それは両方としてfalseを与えます。

func getDefaults() {        
    let stanDefaults = UserDefaults.standard
    print("Default value of Update - \(stanDefaults.bool(forKey: "update_lot_pref"))")
    print("\nDefault value of Reminder - \(stanDefaults.bool(forKey: "reminder_pref"))")
}

Updateのデフォルト値-false Reminderのデフォルト値-false

これらの値(Root.plistのデフォルト値とデフォルトの値)を同期する場合は、プログラムで設定する必要があります。

func setApplicationDefault() {
    let stanDefaults = UserDefaults.standard
    let appDefaults = ["reminder_pref": true]
    stanDefaults.register(defaults: appDefaults)
    stanDefaults.synchronize()
}

ここで私のRoot.plistには、[〜#〜] yes [〜#〜]のデフォルト値があり、viewDidloadの場合、この設定値を次のように設定しますtrue。実行すると、

リマインダーのデフォルト値-true

そして、これが私のRoot.plistの外観です。

enter image description here

それが役に立てば幸い。

7
manismku

デモのために、設定バンドルに2つのスイッチがあると仮定しましょう。 1つはデフォルト値がYESに設定され、もう1つはデフォルト値がNOに設定されています。

Settings.bundle content

アプリのUserDefaultsからSettings.bundleで定義されたデフォルト値にアクセスできるようにするには、最初にそれらを登録する必要があります。残念ながら、iOSはあなたのためにそれをしません、そしてあなたは自分でそれを世話しなければなりません。

次のメソッドは、Root.plistに関連付けられたSettings.bundleをスキャンし、設定の識別子のデフォルト値を登録します。

func registerDefaultsFromSettingsBundle()
{
    let settingsUrl = Bundle.main.url(forResource: "Settings", withExtension: "bundle")!.appendingPathComponent("Root.plist")
    let settingsPlist = NSDictionary(contentsOf:settingsUrl)!
    let preferences = settingsPlist["PreferenceSpecifiers"] as! [NSDictionary]

    var defaultsToRegister = Dictionary<String, Any>()

    for preference in preferences {
        guard let key = preference["Key"] as? String else {
            NSLog("Key not fount")
            continue
        }
        defaultsToRegister[key] = preference["DefaultValue"]
    }
    UserDefaults.standard.register(defaults: defaultsToRegister)
}

できるだけ早く実行することをお勧めします。アプリのすべての部分にデフォルトがあることを確認できます。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool
{
    registerDefaultsFromSettingsBundle()

    let one = UserDefaults.standard.bool(forKey: "switch_one")
    let two = UserDefaults.standard.bool(forKey: "switch_two")

    NSLog("One: \(one), Two: \(two)")

    return true
}
15

以下のようにUserDefaults.didChangeNotificationの通知を追加します。

override func viewDidLoad() {
    super.viewDidLoad()
    registerSettingsBundle()
    NotificationCenter.default.addObserver(self, selector: #selector(updateDisplayFromDefaults), name: UserDefaults.didChangeNotification, object: nil)
    updateDisplayFromDefaults()
}
func registerSettingsBundle(){
    let appDefaults = [String:AnyObject]()
    UserDefaults.standard.register(defaults: appDefaults)
    UserDefaults.standard.synchronize()
}

func updateDisplayFromDefaults(){
    let defaults = UserDefaults.standard
    let update_lot = defaults.bool(forKey: "update_lot")
    print(update_lot)
}
2
Vini App

私はあなたが求めていることを正確に追跡するのに少し問題がありますが、未定義の場合(ユーザーが設定していない場合など)いくつかのデフォルトが「true」であることを指定する設定バンドルplistを作成したようですデフォルトはtrueです)。しかし、私はあなたがそうするときを思います:

let update_lot = defaults.bool(forKey: "update_lot")

...このコードでは、「unset」が「false」ではなく「true」に評価される必要があることを認識する方法はありません。代わりにdefaults.object(forkey: "update_lot")を使用し、それがオブジェクトを返す場合は、そのオブジェクトのブール値を取得します(または、その時点でdefaults.boolを呼び出すだけです)。

0
Jeremy Brown