我正在开发一个iPhone应用程序
我从root.plist读取了一个密钥,如下所示:
NSString *Key1Var = [[NSUserDefaults standardUserDefaults] stringForKey:@"Key1"];("Key1“是root.plist中已经设置了默认字符串值的PSMultiValueSpecifier )
一旦用户进行了设置,它就能正常工作。但是,如果用户在进行任何设置之前运行该应用程序,他将获得"Key1“的nil。在这种情况下,我期望的是我为"Key1“设置的默认值。我需要做什么,以便用户不必进行设置,才能使应用程序第一次运行?
你好,哈里什
发布于 2012-05-08 19:40:32
有关完整的解决方案,请参阅this question。
实际上,您希望在访问设置之前运行以下代码:
- (void)registerDefaultsFromSettingsBundle {
NSString *settingsBundle = [[NSBundle mainBundle] pathForResource:@"Settings" ofType:@"bundle"];
if(!settingsBundle) {
NSLog(@"Could not find Settings.bundle");
return;
}
NSDictionary *settings = [NSDictionary dictionaryWithContentsOfFile:[settingsBundle stringByAppendingPathComponent:@"Root.plist"]];
NSArray *preferences = [settings objectForKey:@"PreferenceSpecifiers"];
NSMutableDictionary *defaultsToRegister = [[NSMutableDictionary alloc] initWithCapacity:[preferences count]];
for(NSDictionary *prefSpecification in preferences) {
NSString *key = [prefSpecification objectForKey:@"Key"];
if(key) {
[defaultsToRegister setObject:[prefSpecification objectForKey:@"DefaultValue"] forKey:key];
}
}
[[NSUserDefaults standardUserDefaults] registerDefaults:defaultsToRegister];
[defaultsToRegister release];
}这会将默认值加载到standardUserDefaults对象中,这样就不会再返回nil值,也不必在代码中重复默认设置。
发布于 2009-09-16 05:56:35
在我尝试获取我的设置之前,我会在启动后的早期执行此操作:
userDefaultsValuesPath=[[NSBundle mainBundle] pathForResource:@"UserDefaults"
ofType:@"plist"];
userDefaultsValuesDict=[NSDictionary dictionaryWithContentsOfFile:userDefaultsValuesPath];
// set them in the standard user defaults
[[NSUserDefaults standardUserDefaults] registerDefaults:userDefaultsValuesDict];
if (![[NSUserDefaults standardUserDefaults] synchronize])
NSLog(@"not successful in writing the default prefs");发布于 2017-04-24 23:56:51
基于Mike Weller's原始解决方案的Swift 3版本,如果有人需要它:
static func registerDefaultsFromSettingsBundle() {
guard let settingsBundle = Bundle.main.url(forResource: "Settings", withExtension: "bundle") else {
print("Could not find Settings.bundle")
return
}
guard let settings = NSDictionary(contentsOf: settingsBundle.appendingPathComponent("Root.plist")) else {
print("Couldn't find Root.plist in settings bundle")
return
}
guard let preferences = settings.object(forKey: "PreferenceSpecifiers") as? [[String: AnyObject]] else {
print("Root.plist has an invalid format")
return
}
var defaultsToRegister = [String: AnyObject]()
for var p in preferences {
if let k = p["Key"] as? String, let v = p["DefaultValue"] {
print("Registering " + v.debugDescription + " for key " + k)
defaultsToRegister[k] = v as AnyObject
}
}
UserDefaults.standard.register(defaults: defaultsToRegister)
}https://stackoverflow.com/questions/1431148
复制相似问题