我正在将一个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文件?
答案 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)
}