【问题标题】:UISwitch requires OFF then ON click (or vice versa) for it to "save" the value and workUISwitch 需要关闭然后点击(反之亦然)才能“保存”值并工作
【发布时间】:2014-05-27 01:30:20
【问题描述】:

我有 2 个视图控制器...游戏设置视图控制器(包含 UISwitch)和游戏视图控制器。默认情况下,开关的状态为 ON(在情节提要中设置)。开关的功能是设置物体向上或向下。

步骤: 1.当我第一次加载游戏时,开关打开,我玩游戏并且对象根据开关设置正确移动(在这种情况下向上)。
2.我关闭并重新打开游戏,开关打开,我将其切换到关闭,我玩游戏并且对象根据开关设置正确移动(在这种情况下向下)。 [BUG] - 3. 我关闭并重新打开应用程序,开关又回到 ON(因为这是默认设置),我玩游戏时,对象没有根据开关设置正确移动。它应该向上,因为开关打开。 [解决方法] - 我必须关闭开关然后再打开才能工作。

这是我的 2 个视图控制器:

GameSettingsViewController:

.h

@property (nonatomic, strong) IBOutlet UISwitch *UISwitchInvertGravity;

.m

-(IBAction)SwitchGravity {

    NSUserDefaults *GravitySwitchValue = [NSUserDefaults standardUserDefaults];
    [GravitySwitchValue setBool:self.UISwitchInvertGravity.on forKey:@"SwitchOn"];
    [GravitySwitchValue synchronize];

GameViewController

.m

-(void)ObjectMoving {

    NSUserDefaults *GravitySwitchValue = [NSUserDefaults standardUserDefaults];
    BOOL SwitchOn = [GravitySwitchValue boolForKey:@"SwitchOn"];

    if (SwitchOn) {

        object.center = CGPointMake(object.center.x, object.center.y + objectFlight);
        objectFlight = objectFlight - 5;
        if (objectFlight < -15) {
            objectFlight = -15;
        }
    }
    else {

        object.center = CGPointMake(object.center.x, object.center.y - objectFlight);
        objectFlight = objectFlight - 5;
        if (objectFlight < -15) {
            objectFlight = -15;
        }
    }

    if (objectFlight > 0) {
        object.image = [UIImage imageNamed:@"object-down.png"];
        }
    if (objectFlight < 0) {
        object.image = [UIImage imageNamed:@"object-up.png"];
    }
}

【问题讨论】:

  • 我需要澄清一下,如果您不希望保留该值,为什么还要保存为用户默认值?
  • 我对 Objective-c 有点陌生,所以我的澄清可能会导致您建议的重写;)当我在 1 个视图中查看所有内容时,一切正常(没有 nsuserdefault)。在将其分成 2 个视图并进行研究后,我继续阅读有关 nsuserdefault 的内容,并认为这是一种在另一个视图中保存和检索开关设置的方法。我的困惑是如何让我的开关设置反映在一个单独的 VC 中。我还希望最后一个开关设置在关闭并重新打开应用程序后保持不变。
  • 所有 MethodNames 应该是 dromedarCase (这意味着第一个字母不大写)。与属性和变量相同。只有 ClassNames 应该是 CamelCase。
  • 感谢您的提示。我会清理干净的。

标签: ios uiswitch


【解决方案1】:

我认为你需要这样做:

1 在 app delegate 中将 userdefault 中的“SwitchOn”设置为 yes(此功能仅在您首次启动应用时运行一次。)。

2 当您进入(加载)包含该 UISwitch 的视图控制器时,将 UISwitch 的值设置为与“SwitchOn”用户默认值相同。

【讨论】:

  • 这行得通,谢谢! 在 AppDelegate 中,我添加了: NSUserDefaults *GravitySwitchValue = [NSUserDefaults standardUserDefaults]; if (![GravitySwitchValue objectForKey:@"SwitchOn"]) { [GravitySwitchValue setBool:YES forKey:@"SwitchOn"]; } 在 GameSettingsViewController 中,我添加了: _UISwitchInvertGravity.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"SwitchOn"];
【解决方案2】:

如果我确切地知道想要的效果是什么,我可以更好地回答它。不过,这是我的猜测。

设置 UISwitch 的视觉默认值不会自动将您存储的 NSDefault "SwitchOn" 值更新为 YES/NO 布尔值。 p>

以下是您的选择:

  1. 当您的应用打开时:将 UISwitch 值更新为存储的 NSDefault 值(如果有)。
  2. 或者,当您的应用打开时:将 NSDefault 值更新回所需的默认值。

如果您选择选项 2,如果您没有在任何地方使用它,我强烈建议您简单地删除此 NSDefault 逻辑,因为在这种情况下它基本上是无用的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-07
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多