2017-09-27 131 views
6

我创建了一个包含约8个切换开关的设置包。我试图做的是从设置包中获取默认值。目前,现在我有两种方法:Swift 4设置包,获取默认值

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

然而,这并不让我的默认值(这些都是真实的,但他们都返回false)。这工作,并给我正确的价值,如果我关闭应用程序,打开设置,调整设置并重新打开应用程序。有没有获得默认设置?我走了阅读plist的路线,但如果我更改了我的设置包中的设置,它将不会生效。为UserDefaults.didChangeNotification

+0

你好,我想你忘记了DEFAULT.SET关键 “update_lot” sample.code:UserDefaults.standard.set(真,forKey: “update_lot”) – Vivek

+0

你可以把一个例子,一个答案吗? – user979331

+0

请检查此示例'UserDefaults.standardUserDefaults()。setBool(true,forKey:“update_lot”)' – Vivek

回答

2

这并不让我的默认值(这些都是真实的,但他们 全部返回false)

看起来你有显示为在设置包和当拨动开关你读丛书你会得到所有错误的价值。

如果是这种情况,那么你在这里错过了一些东西。

在设置包(Root.plist)中,我们有“默认值”字段,它与切换开关的实际默认值无关。这只是一个可以切换的视觉指示器。 您可能在plist中将“默认值”设置为“YES”,但当您尝试读取该值时,您将最终得到false

enter image description here

在这里,我已经在Root.plist设置默认值用于提醒如YES更新NO 让应用程序启动时,如上图所示。

但是,当我试图读取这些默认值 - 它提供了。更新的

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

默认值 - 提醒的假默认值 - 假

现在,如果你要同步这些值 - 在Root.plist默认值和默认值 - 那么你必须以编程方式进行设置。

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

在这里,我Root.plist我有默认值YES以及当viewDidLoad中我设置优先级值看作。当我运行它给了我提示的

默认值 - 真

这是我Root.plist的样子。

enter image description here

希望它能帮助。

2

新增通知如下图所示:

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) 
} 
+0

我试过这个,我的价值仍然返回错误:( – user979331

+1

请检查https://stackoverflow.com/questions/ 9181544/setting-bundle-default-value-wont-set –

+0

不需要强制'synchronize()'。什么是默认的空字典注册的目的?btw Swift原生字典值类型,因为Swift3是'Any' AnyObject'。然后检查寄存器签名'func register(defaults registrationDictionary:[String:Any])'。同时声明'appDefaults'为常量,这将永远是一个空字典 –

0

我有以下的正是你问一点点麻烦,但它听起来就像你已经创建了一个设置捆绑的plist,指定一些如果未定义,则默认值为“true”(以便如果用户没有设置它们,则默认为true)。但我认为,当你做:

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

...有没有办法让这个代码就知道“未设置”应该评估为“真”,而不是“假”。您可以使用defaults.object(forkey: "update_lot")来代替,如果返回一个对象,则获取该对象的布尔值(或者只是在该点调用defaults.bool),但是如果它返回nil,则假定它为true。

3

为了演示,我们假设您在设置包中有两个开关。一个默认值设置为YES,另一个默认值设置为NO

Settings.bundle content

如果您希望能够从UserDefaults访问你的应用程序在Settings.bundle定义的默认值,你必须先登记。不幸的是,iOS不会为你做,你必须自己照顾它。

以下方法扫描与Settings.bundle关联的Root.plist,并注册您的首选项的标识符的默认值。

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 
}