从Settings.bundle plist文件注册的默认设置?(Register default

2019-07-17 16:08发布

我加入一个Settings.bundle文件到我的iPhone应用程序。 这是非常小的一个或两个设置。 在Settings.bundle plist文件指定了默认值,来设置应用程序。 我读过,让我的iPhone应用程序知道这些默认值,我也必须它们编码到我的应用程序。 这似乎是在重复自己,并留下一个开放性的默认轻松搞定不同步的,我修改程序。

我知道我可以使用注册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文件?

Answer 1:

想补充这是安迪的回答评论,但堆栈溢出没有让我(太长的评论)。
如果您使用ObjC这里是你的版本:

-(void)registerDefaults
{
    NSString* pathString = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"Settings.bundle"];
    NSString* rootPath = [pathString stringByAppendingPathComponent:@"Root.plist"];
    NSDictionary* settingsDict = [NSDictionary dictionaryWithContentsOfFile:rootPath];
    NSArray* prefSpecifiers = settingsDict[@"PreferenceSpecifiers"] ;

    NSMutableDictionary* defaults = [NSMutableDictionary dictionary];

    for (NSDictionary* item in prefSpecifiers) {
        NSString* theKey = item[@"Key"];
        NSObject* defaultValue = item[@"DefaultValue"];

        if (defaultValue && theKey) {
            defaults[theKey] = defaultValue;
        }

    }

    if (defaults.count > 0) {
        [[NSUserDefaults standardUserDefaults] registerDefaults:defaults];
    }

}


Answer 2:

对的,这是可能的。 这里是你会怎么做的雨燕:

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

这将与各主要加载PreferenceSpecifier的默认值。 例如:

<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默认值加载到用户默认为“频率”。

我建议你拨打loadDefaults功能应用程序委托,从didFinishLaunchingWithOptions处理程序,如下所示:

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

    loadDefaults()

    return true
}

再后来在您的应用程序,例如在一个UITableViewController ,你可以加载这样的用户默认值:

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


Answer 3:

这是没有必要的,你可以简单地通过调用,它被分配到plist中,例如键调用plist中的数据,

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


Answer 4:

基于安迪的回答以上 ,适合雨燕4,避免使用武力,展开/力铸:

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


文章来源: Register default settings from the Settings.bundle plist file?