【问题标题】:Why Isn't NSUserDefaults working with my UISwitch为什么 NSUserDefaults 不能与我的 UISwitch 一起使用
【发布时间】:2011-12-25 14:03:56
【问题描述】:

我正在尝试设置一个默认关闭的 UISwitch,直到用户打开它。但是它现在默认显示为 ON。

AppDelegate 的 didFinishLaunching:

NSString *testValue = [[NSUserDefaults standardUserDefaults] stringForKey:@"pinCodeSwitch"];
if (!testValue) {
    // since no default values have been set, create them here
    [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"pinCodeSwitch"];
    [[NSUserDefaults standardUserDefaults] synchronize];
} 

VC 的 viewDidAppear:

UISwitch* testSwitch = [[[UISwitch alloc] init] autorelease];
if ([[NSUserDefaults standardUserDefaults] boolForKey:@"pinCodeSwitch"]) {
    [testSwitch setOn:NO animated:NO];
}
self.pinCodeSwitch = testSwitch;

UISwitch 值改变时保存 BOOL 的方法:

- (IBAction)pinCodeSwitchChanged:(id)sender
{
    [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"pinCodeSwitch"];
    BOOL test = [[NSUserDefaults standardUserDefaults] boolForKey:@"pinCodeSwitch"];
}

【问题讨论】:

    标签: iphone objective-c cocoa-touch nsuserdefaults uiswitch


    【解决方案1】:

    您可以在Interface Builder 中通过将“STATE”值指定为OFF 来指定此值。 然后通过应用以下代码保存开关值:

    [YourUiSwitch setOn:NO animated:YES];
    [[NSUserDefaults standardUserDefaults]setValue:YourUiSwitch forKey:@"youruiswitch"];
    [[NSUserDefaults standardUserDefaults]synchronize];
    

    当视图加载时,从默认值加载它,如下所示:`YourUiSwitch =

    [[NSUserDefaults standardUserDefaults]valueForKey:@"youruiswitch"];`
    

    祝你好运!

    【讨论】:

    • 是的,但它是否应该加载为 NO,因为它已经在 App Delegate 中设置为 NO?
    • 这会将开关设置为 OFF,因为您是在 IB 中设置的。没有什么可测试的,因为它实际上并没有做任何事情。如果值更改为 ON,您甚至没有代码来保存它。
    • 没有。您将以编程方式从 viewdidload 上的默认值加载开关,它将接管 IB 设置
    • 但是当我将 UISwitch 切换到 ON 时它会在哪里保存状态?
    • 当您将开关保存为默认值时,您还保存了他的所有属性设置。所以当你加载它时,你也会加载设置
    【解决方案2】:

    由于您将“pinCodeSwitch”设置为 NO,因此您无法设置开关。它跳过 if 语句。 将其更改为:

    if (![[NSUserDefaults standardUserDefaults] boolForKey:@"pinCodeSwitch"]) 
    

    (否定您的测试),然后开关将关闭。

    【讨论】:

    • 于是我把代码改成了UISwitch* testSwitch = [[[UISwitch alloc] init] autorelease]; if (![[NSUserDefaults standardUserDefaults] boolForKey:@"pinCodeSwitch"]) [testSwitch setOn:NO animated:NO]; } self.pinCodeSwitch = testSwitch;。加载vc时它仍然亮着。
    • 你能在[testSwitch setOn:NO animated:NO]处设置一个断点吗?线?您的程序是否达到了该断点?
    • 是的,它确实达到了那个断点。在 IB 中,开关状态设置为 ON,但这不应该有所不同,因为代码应该将其更改为 off。
    • 我很难过,该代码应该将其设置为关闭。是否有任何其他稍后执行的代码可以将其切换回来。
    • 我还没有实现代码什么来保存新状态的值改变了。我目前只有我在应用程序委托中发布的代码,以及实际 VC 中的代码。
    猜你喜欢
    • 2011-11-03
    • 2020-10-08
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-26
    • 2013-07-02
    相关资源
    最近更新 更多