【问题标题】:iOS7 Xcode5 switch state NSUserDefaultsiOS7 Xcode5 开关状态 NSUserDefaults
【发布时间】:2014-08-08 10:13:29
【问题描述】:

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

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

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

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

非常感谢!

@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

【问题讨论】:

  • 您使用的是一个开关还是三个不同的开关?
  • 单个视图中只有 1 个
  • 好的,所以有 3 个视图和 3 个开关,对吗?
  • 问题不清楚,希望您需要tag 属性。
  • 是的,没错@MohitPopat

标签: ios ios7 xcode5 nsuserdefaults uiswitch


【解决方案1】:

您的代码对所有参与者使用相同的密钥 - 这是您应该注意的。

由于您显然为每个人设置了姓名(如果我们假设两个与会者的姓名不同),您可以利用这一点。

更改所有 @"SwitchState" 引用

类似

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

这将有效地分别保存每个与会者的开关状态。

【讨论】:

    【解决方案2】:

    按照您的思路,您需要在 NSUserDefaults 中存储 3 个键,每个人一个。例如,如果您有 1000 人,使用它会很麻烦。

    我相信实现这一点的正确方法是在您的 GuestInfoViewController 上使用 Delegate。

    我会这样做:

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

    这样,所有内容都会更新,并且所有信息都正确无误。如果您在做委托时需要帮助,您可以在 Stackoverflow 上找到一百万个示例。或者问,我会详细说明。

    ** 编辑 **

    处理简单的 Person 对象时,您甚至不需要委托,它更简单。检查附件中的项目:http://www.brunotereso.net/temp/DelegateProject.zip(请注意,这只是我为向您展示如何执行此操作的一段代码。如果您实现了类似的东西,请查看 cellForRowAtIndexPath 并使用可重复使用的单元格)

    【讨论】:

    • Person 对象非常合适,但我从加载在 GuestTableViewController 中的 plist 中获取信息。代表将如何在这里工作?
    • 您可以从 plist 加载对象列表。我给你写个例子。
    • 您可以加载到字典或数组中,加载后您可以对其进行迭代并创建对象列表。 stackoverflow.com/questions/7577479/… ,它添加了一些代码,但最后,你做对了 :) NSUserDefaults 如果非常有限。
    • 我用示例项目和您需要的代码更新了答案。
    猜你喜欢
    • 2013-10-11
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-01
    相关资源
    最近更新 更多