iOS7 Xcode5开关状态NSUserDefaults

时间:2014-08-08 10:13:29

标签: ios ios7 xcode5 nsuserdefaults uiswitch

我对iOS很陌生,所以这是我的问题。我有一个表视图(GuestTableViewController)列出了聚会中的一些客人。当我点击一个人时,我会显示一个新视图(GuestInfoViewController),其中包含有关此与会者的一些信息。在这个视图中我有开关按钮,所以如果我有3个人,将有3个开关指示它们中的每一个是否来。

在我的GuestInfoViewController中的IBAction中使用NSUserDefaults我已经实现了在视图之间保存其状态(ON / OFF)。

问题在于,当我单击一个开关时,所有开关都会改变状态。如何引用每个开关。

注意:我可以在故事板上发布图像,甚至可以根据需要发布一些代码。

非常感谢你!

@implementation GuestInfoViewController

@synthesize nom,cognoms,foto;
@synthesize setNom,setCognoms,setFoto;
@synthesize mySwitch;

- (void)viewDidLoad
{
    [super viewDidLoad];
    nom.text = setNom;
    cognoms.text = setCognoms;
    [foto setImage:[UIImage imageNamed:setFoto]];

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    if ([defaults objectForKey:@"SwitchState"])
        self.mySwitch.on = [defaults boolForKey:@"SwitchState"];

}

- (IBAction)switch:(id)sender {
    if(mySwitch.on){
        NSLog(@"Switch is ON");
    }
    if(!mySwitch.on){
        NSLog(@"Switch is OFF");
    }
}

- (IBAction)saveSwitchState:(id)sender
{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    if ([self.mySwitch isOn])
        [defaults setBool:YES forKey:@"SwitchState"];
    else
        [defaults setBool:NO forKey:@"SwitchState"];
}

@end

2 个答案:

答案 0 :(得分:0)

您的代码对所有与会者使用相同的密钥 - 这是您应该照顾的。

由于您显然为每个人设置了姓名(如果我们假设两名与会者不具有相同名称),您可以利用此优势。

更改所有@"SwitchState"引用

类似

[NSString stringWithFormat:@"SwitchState_%@_%@",setNom,setCognoms]

这将有效地分别为每个与会者保存交换机的状态。

答案 1 :(得分:0)

使用您的思路,您需要在NSUserDefaults中存储3个密钥,每个人一个。如果你有1000个人,那么使用它会很麻烦。

我认为实现这一点的正确方法是在GuestInfoViewController上使用Delegate。

这就是我要做的事情:

  • GuestTableViewController有一个Person对象列表,Person对象有一个BOOL可供选择。
  • GuestInfoViewController,读取BOOL值以显示开关,如果值已更改,则会触发委托并更新GuestTableViewController中的列表。

这样,一切都会更新,所有信息都是正确的。如果您需要帮助来完成委托,您可以在Stackoverflow上找到一百万个示例。或者问一下,我会详细说明。

**编辑**

当处理一个简单的Person对象时,你甚至不需要一个委托,它更简单。在附件中检查项目:http://www.brunotereso.net/temp/DelegateProject.zip(请注意,这只是我用来向您展示如何操作的一段代码。如果您实现类似的内容,请查看cellForRowAtIndexPath并使用可重复使用的细胞)