約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を読む方法を取りましたが、設定バンドルの設定を変更すると、有効になりません。
これは私にデフォルト値を取得しません(すべて真ですが、すべて偽を返します)
設定バンドルでONと表示されるトグルスイッチがあり、バンドルを読み取るとすべてのfalse値が表示されるようです。
これに該当する場合は、ここで何か不足しています。
Bundle(Root.plist)の設定では、 "Default Value"フィールドがあり、トグルスイッチの実際のデフォルト値とは関係ありません。これは、切り替える視覚的なインジケータにすぎません。 plistで「デフォルト値」が「YES」に設定されている可能性がありますが、値を読み取ろうとするとfalseになります。
ここでは、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の外観です。
それが役に立てば幸い。
デモのために、設定バンドルに2つのスイッチがあると仮定しましょう。 1つはデフォルト値がYES
に設定され、もう1つはデフォルト値がNO
に設定されています。
アプリの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
}
以下のように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)
}
私はあなたが求めていることを正確に追跡するのに少し問題がありますが、未定義の場合(ユーザーが設定していない場合など)いくつかのデフォルトが「true」であることを指定する設定バンドルplistを作成したようですデフォルトはtrueです)。しかし、私はあなたがそうするときを思います:
let update_lot = defaults.bool(forKey: "update_lot")
...このコードでは、「unset」が「false」ではなく「true」に評価される必要があることを認識する方法はありません。代わりにdefaults.object(forkey: "update_lot")
を使用し、それがオブジェクトを返す場合は、そのオブジェクトのブール値を取得します(または、その時点でdefaults.bool
を呼び出すだけです)。