【问题标题】:Setting Bundle not outputting correct value设置Bundle没有输出正确的值
【发布时间】:2012-03-21 19:47:59
【问题描述】:

这是问题所在,我从 Xcode 启动我的应用程序并启动并运行,然后我切换到 settings.app 并将切换开关从 NO 更改为 YES,当我切换回我的应用程序时,键输出 NO not YES。

我认为我遇到了下面的引用,但不确定如何绕过它,如果用户启动应用程序并转到设置并更改切换,它现在不同步,因为 Settings.app 输出在第一次发射到 NO。用户第一次切换到 settings.app 时无法更改设置是没有意义的

“对于新安装的应用程序,应用程序设置包中的默认首选项值在设置应用程序运行之前不会设置。这意味着如果用户在运行设置之前运行您的应用程序,则设置包中指定的默认值不可用。 "

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSDictionary *appDefaults = [NSDictionary dictionaryWithObject:@"NO" forKey:@"hideActionBar"];
[defaults registerDefaults:appDefaults];
[defaults synchronize];

然后是我用来检查的代码

- (void)applicationDidBecomeActive:(UIApplication *)application {
 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
 BOOL hidden = [defaults boolForKey:@"hideActionBar"];
 NSLog(@"%d",hidden);

if (hidden) {
    viewController.actionButton.enabled = NO;

} else {


    viewController.actionButton.enabled = YES;
}    
}

和我的设置 Root.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"      "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Type</key>
<string>PSToggleSwitchSpecifier</string>
<key>Title</key>
<string>Hide Action Bar</string>
<key>Key</key>
<string>hideActionBar</string>
<key>DefaultValue</key>
<false/>
<key>TrueValue</key>
<true/>
<key>FalseValue</key>
<false/>
</dict>
</plist>

【问题讨论】:

    标签: objective-c ios settings.bundle


    【解决方案1】:

    对于BOOL 变量,如果您希望它为NO,则无需设置任何值。因为当您第一次尝试访问它时,它会返回相同的结果。所以从你的applicationDidFinishLaunchingWithOptions 方法中删除registerDefaults 代码(所有四行)。

    说明:

    当您将设置从NO 更改为YES 并启动您的应用程序时,在applicationDidFinishLaunchingWithOptions 中,此值一旦以编程方式更改为NO。

    注意: 每当您在应用程序中使用设置包时,在注册值(对象值,因为原始类型将返回 0)之前检查该值是否为 nil(这意味着仍未注册),如果 key 的值为 nil 则只注册初始默认值,否则您最终将每次以编程方式更改值。

    谢谢,

    【讨论】:

    • 非常感谢,非常有帮助的答案。我发现使用从设置返回到我的应用程序的快速切换并没有足够快地写入 nsdefaults 键,我的应用程序无法看到新值。我必须想办法解决这个问题,也许如果我在检查键值之前添加后台 10 分钟执行的东西或设置几秒钟的计时器。
    猜你喜欢
    • 2012-09-26
    • 2019-07-30
    • 2014-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多