从Settings.bundle plist文件注册默认设置?

时间:2012-12-29 00:16:12

标签: xcode plist settings.bundle

我正在将一个Settings.bundle文件添加到我的iOS应用程序中。一个或两个设置非常小。 Settings.bundle中的plist文件指定Settings应用程序的默认值。我已经读过,要让我的iOS应用程序知道这些默认值,我还必须将它们编码到我的应用程序中。这似乎重复了我自己,并在修改程序时留下默认设置的开头很容易失去同步。

我知道我可以使用plist文件的内容注册默认值,如下所示:

[[NSUserDefaults standardUserDefaults] registerDefaults:[NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Defaults" ofType:@"plist"]]];

但这似乎也在重复我自己。是否可以使用Settings.bundle中的plist文件作为这些默认值的来源,以便我只在1个位置指定默认值?

我调整了负载看起来像这样:

[[NSUserDefaults standardUserDefaults] registerDefaults:[NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Settings.bundle/Root" ofType:@"plist"]]];
但是,这不起作用。有人知道这是否可行,以及如何加载该plist文件?

3 个答案:

答案 0 :(得分:1)

是的,有可能。以下是你在Swift中的表现:

func loadDefaults() {

    let pathStr = NSBundle.mainBundle().bundlePath
    let settingsBundlePath = pathStr.stringByAppendingPathComponent("Settings.bundle")
    let finalPath = settingsBundlePath.stringByAppendingPathComponent("Root.plist")
    let settingsDict = NSDictionary(contentsOfFile: finalPath)
    let prefSpecifierArray = settingsDict?.objectForKey("PreferenceSpecifiers") as NSArray

    var defaults:[NSObject:AnyObject] = [:]

    for prefItem in prefSpecifierArray {

        if let key = prefItem.objectForKey("Key") as String! {

            let defaultValue:AnyObject? = prefItem.objectForKey("DefaultValue")
            defaults[key] = defaultValue
        }
    }

    _userDefaults.registerDefaults(defaults)
}

这将使用Key从每个PreferenceSpecifier加载DefaultValue。例如:

<dict>
    <key>Type</key>
    <string>PSMultiValueSpecifier</string>
    <key>Title</key>
    <string>Frequency</string>
    <key>Key</key>
    <string>frequency</string>
    <key>DefaultValue</key>
    <integer>15</integer>
    <key>Titles</key>
    <array>
        <string>5 minutes</string>
        <string>15 minutes</string>
        <string>30 minutes</string>
        <string>60 minutes</string>
    </array>
    <key>Values</key>
    <array>
        <integer>5</integer>
        <integer>15</integer>
        <integer>30</integer>
        <integer>60</integer>
    </array>
</dict>

loadDefaults函数会将默认值15加载到“frequency”的用户默认值中。

我建议您从loadDefaults处理程序调用您的app委托的didFinishLaunchingWithOptions函数,如下所示:

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

    loadDefaults()

    return true
}

然后在您的应用中,在UITableViewController中说,您可以加载用户默认值,如下所示:

let kFrequency = "frequency"
frequency = _userDefaults.integerForKey(kFrequency)

答案 1 :(得分:0)

这不是必需的,您可以通过调用plist中分配给它的键来简单地调用plist中的数据,例如,

_buttonSelection = [[NSUserDefaults standardUserDefaults] stringForKey:@"buttonAction01"]; //_buttonSelection is a NSString so that can be anything

答案 2 :(得分:0)

基于Andy's answer above,适用于 Swift 4 ,并避免使用force-unwrap / force-cast:

private func loadDefaults() {
    let userDefaults = UserDefaults.standard

    let pathStr = Bundle.main.bundlePath
    let settingsBundlePath = (pathStr as NSString).appendingPathComponent("Settings.bundle")
    let finalPath = (settingsBundlePath as NSString).appendingPathComponent("Root.plist")
    let settingsDict = NSDictionary(contentsOfFile: finalPath)
    guard let prefSpecifierArray = settingsDict?.object(forKey: "PreferenceSpecifiers") as? [[String: Any]] else {
        return
    }

    var defaults = [String: Any]()

    for prefItem in prefSpecifierArray {
        guard let key = prefItem["Key"] as? String else {
            continue
        }
        defaults[key] = prefItem["DefaultValue"]
    }
    userDefaults.register(defaults: defaults)
}