我加入一个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文件?
想补充这是安迪的回答评论,但堆栈溢出没有让我(太长的评论)。
如果您使用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];
}
}
对的,这是可能的。 这里是你会怎么做的雨燕:
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)
这是没有必要的,你可以简单地通过调用,它被分配到plist中,例如键调用plist中的数据,
_buttonSelection = [[NSUserDefaults standardUserDefaults] stringForKey:@"buttonAction01"]; //_buttonSelection is a NSString so that can be anything
基于安迪的回答以上 ,适合雨燕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)
}