Iphone 使用NSUserDefaults存储UISwitch状态

Iphone 使用NSUserDefaults存储UISwitch状态,iphone,objective-c,selector,nsuserdefaults,uiswitch,Iphone,Objective C,Selector,Nsuserdefaults,Uiswitch,我正在尝试在应用程序的设置视图中保持UISwitch状态。基本上,它是一个UITableView,包含几个开关以获取用户首选项。下面的代码解释了交换机是如何构造的。下面只给出了一个交换机构造,其他交换机也是以同样的方式构造的 if (cell == nil) { cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:SomeIdentifierB] autorelease];

我正在尝试在应用程序的设置视图中保持UISwitch状态。基本上,它是一个UITableView,包含几个开关以获取用户首选项。下面的代码解释了交换机是如何构造的。下面只给出了一个交换机构造,其他交换机也是以同样的方式构造的

if (cell == nil) {
            cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:SomeIdentifierB] autorelease];
            if (syncStartupSwitch) {
                syncSwitch.on = YES;
            }else {
                syncSwitch.on = NO;
            }

            [syncSwitch addTarget:self action:@selector(syncAtStartup:) forControlEvents:UIControlEventValueChanged];


            NSLog(@"Why is this not working%@",(syncSwitch.on ? @"YES" : @"NO"));
                [cell.contentView addSubview:syncSwitch];
            cell.accessoryView = syncSwitch;
            cell.selectionStyle = UITableViewCellSelectionStyleNone;
                //cell.reuseIdentifier  = @"Cell1";
        }
        cell.textLabel.text =cellValue;
        return cell;
    }
现在,我想使用NSUserDefaults存储交换机的状态。因此,在我的选择器方法实现中,我定义了如下NSUserDefaults:

-(void) syncAtStartup:(id)sender {
    if ([sender isOn]) {
        [[NSUserDefaults standardUserDefaults]
         setObject:@"YES" forKey:@"SyncAtStartup"];
        [[NSUserDefaults standardUserDefaults]synchronize];
        NSLog(@"%@",(syncStartupSwitch ? @"YES" : @"NO"));

    }else {
        [[NSUserDefaults standardUserDefaults]
         setObject:@"NO" forKey:@"SyncAtStartup"];
            //syncStartupSwitch = [[NSUserDefaults standardUserDefaults]boolForKey:@"SyncAtStartup"];

    }
}
syncSwitch.on = syncStartupSwitch;
最后,在我的viewDidLoad中,我编写了以下代码行:

syncStartupSwitch = [[NSUserDefaults standardUserDefaults]boolForKey:@"SyncAtStartup"];
我确信我的实现缺少一些逻辑。有人能指出缺陷并纠正我吗

更新: 我采纳了@jfalexvijay的建议,并使用了以下代码:

[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"SyncAtStartup"];
BOOL syncStartupSwitch = [[NSUserDefaults standardUserDefaults] boolForKey:@"SyncAtStartup"];
当我查看Preferences文件夹时,我看到创建的plist中包含BOOL值。然后,我尝试在cellForRowAtIndexPath方法中设置UISwitch状态,如下所示:

-(void) syncAtStartup:(id)sender {
    if ([sender isOn]) {
        [[NSUserDefaults standardUserDefaults]
         setObject:@"YES" forKey:@"SyncAtStartup"];
        [[NSUserDefaults standardUserDefaults]synchronize];
        NSLog(@"%@",(syncStartupSwitch ? @"YES" : @"NO"));

    }else {
        [[NSUserDefaults standardUserDefaults]
         setObject:@"NO" forKey:@"SyncAtStartup"];
            //syncStartupSwitch = [[NSUserDefaults standardUserDefaults]boolForKey:@"SyncAtStartup"];

    }
}
syncSwitch.on = syncStartupSwitch;
我在ApplicationWillTerminate和选择器本身中也有这行代码

[[NSUserDefaults standardUserDefaults]synchronize];
不过,在模拟器或设备上重新启动应用程序后,开关状态不会恢复

以上代码中我的错误是什么

干杯


iSee

而不是使用setObject:forKey:尝试使用setBool:forKey:

[[NSUserDefaults standardUserDefaults] setBool:TRUE forKey:@"SyncAtStartup"];
不要使用setObject:forKey:尝试使用setBool:forKey:

[[NSUserDefaults standardUserDefaults] setBool:TRUE forKey:@"SyncAtStartup"];
您可以使用以下代码


[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"SyncAtStartup"];
BOOL test = [[NSUserDefaults standardUserDefaults] boolForKey:@"SyncAtStartup"];
如果您使用以下代码,它将返回YES


[[NSUserDefaults standardUserDefaults] setBool:TRUE forKey:@"SyncAtStartup"];
BOOL test = [[NSUserDefaults standardUserDefaults] boolForKey:@"SyncAtStartup"];

只需测试上述代码

您可以使用以下代码


[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"SyncAtStartup"];
BOOL test = [[NSUserDefaults standardUserDefaults] boolForKey:@"SyncAtStartup"];
如果您使用以下代码,它将返回YES


[[NSUserDefaults standardUserDefaults] setBool:TRUE forKey:@"SyncAtStartup"];
BOOL test = [[NSUserDefaults standardUserDefaults] boolForKey:@"SyncAtStartup"];


只需测试上述代码

除了你想要的是,不是真。是和@YES绝对不是一回事。是/否和真/假之间没有太大的实际区别。在应用程序重新启动后,它仍然没有恢复状态:而不是使用if-else,你可以直接使用syncSwitch.on作为setBool的参数值。您是否已检查syncSwitch.on的值是否正确更改?除非您希望是,不正确。YES和@YES绝对不是同一回事。YES/NO和TRUE/FALSE之间没有太大实际区别。在应用程序重新启动后,它仍然没有恢复状态:您可以直接使用syncSwitch.on作为setBool的参数值,而不是使用if-else。是否已检查syncSwitch.on的值是否正确更改?如果使用setObject,则不应使用boolForKey获取该值;你应该使用valueForKey;如果使用setObject,则不应使用boolForKey获取值;你应该使用valueForKey;嗨,谢谢你的建议。上面的代码运行良好。我可以看到plist文件被BOOL更新,但我仍然无法检索BOOL并相应地设置UISwitch…我已经使用以下示例进行了测试;如果[[NSUserDefaults standardUserDefaults]boolForKey:@SyncAtStartup]syncSwitch.on=[[NSUserDefaults standardUserDefaults]boolForKey:@SyncAtStartup];否则//显示警报。它工作得很好我的错我在给UISwitch赋值时出错了。。。谢谢,我认为这是解决我问题的最佳答案。嗨,谢谢你的建议。上面的代码运行良好。我可以看到plist文件被BOOL更新,但我仍然无法检索BOOL并相应地设置UISwitch…我已经使用以下示例进行了测试;如果[[NSUserDefaults standardUserDefaults]boolForKey:@SyncAtStartup]syncSwitch.on=[[NSUserDefaults standardUserDefaults]boolForKey:@SyncAtStartup];否则//显示警报。它工作得很好我的错我在给UISwitch赋值时出错了。。。谢谢,我认为这是解决我问题的最佳答案。