1

我试图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 存储 Switch 的状态。所以在我的选择器方法实现中,我定义了这样的 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"];

    }
}

最后,在我的 viewDidLoad 中我写了这行代码:

syncStartupSwitch = [[NSUserDefaults standardUserDefaults]boolForKey:@"SyncAtStartup"];

我确信我的实现缺少一些逻辑。有人可以指出缺陷并纠正我吗?

更新: 我接受了@jfalexvijay 的建议并使用了以下代码:

[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"SyncAtStartup"];
BOOL syncStartupSwitch = [[NSUserDefaults standardUserDefaults] boolForKey:@"SyncAtStartup"];

当我查看 Preferences 文件夹时,我看到创建的 plist 中包含 BOOL 值。然后我尝试在 cellForRowAtIndexPath 方法中设置 UISwitch 状态,如下所示:

syncSwitch.on = syncStartupSwitch;

我在 ApplicationWillTerminate 和选择器本身中也有这行代码

[[NSUserDefaults standardUserDefaults]synchronize];

尽管如此,在模拟器或设备上重新启动应用程序后,开关状态并未恢复......

我在上面的代码中有什么错误?

干杯,

我明白

4

2 回答 2

3

您可以使用以下代码;


[[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"];

只需测试上面的代码;

于 2010-11-20T07:43:44.073 回答
1

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

[[NSUserDefaults standardUserDefaults] setBool:TRUE forKey:@"SyncAtStartup"];
于 2010-11-20T06:56:42.117 回答