【问题标题】:How do I Create a Default Slider Value Programmatically?如何以编程方式创建默认滑块值?
【发布时间】:2015-06-09 21:12:40
【问题描述】:

我在界面构建器中为我的滑块设置的“当前值”默认值似乎被完全绕过了,当我运行应用程序时,滑块从我上次运行应用程序时上次设置的位置开始。

我希望滑块从它们的默认值开始,并在切换到不同的视图之前回忆它们最后所处的位置。

这是允许保存滑块值的代码:

viewController.m

- (void)viewWillAppear:(BOOL)animated{
    [_firstSlider setValue:[[NSUserDefaults standardUserDefaults] floatForKey:@"firstSliderValue"]];
}

- (IBAction)firstSliderValueChange:(id)sender {
    [[NSUserDefaults standardUserDefaults] setFloat:[_firstSlider value] forKey:@"firstSliderValue"];
}

谢谢!

【问题讨论】:

  • 这没有意义。滑块如何同时具有默认值和保存值?
  • 澄清一下,我想在开始运行应用程序时初始化一个“默认值”,例如,滑块将始终从“0”开始,但在切换后也会保留它们的值意见。上面的代码完成了后面的问题,但是现在我不知道如何初始化应用程序第一次打开时的值。
  • 我的代码是基于这个问题的解决方案:stackoverflow.com/questions/24170781/…

标签: ios objective-c view uislider


【解决方案1】:

只需像@psobko 在 AppDelegate 中所说的那样添加这个[[NSUserDefaults standardUserDefaults]removeObjectForKey:@"YourKey"];

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"YourKey"];
    return YES;
}

【讨论】:

    【解决方案2】:

    当应用再次启动时,只需移除键的对象:

    [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"firstSliderValue"];
    

    您可以在 AppDelegate 或其他任何有意义的地方执行此操作。

    【讨论】:

    • 没有。那会奏效。但这将是糟糕的代码。不要用新问题来解决问题。
    • 它确实有效!实际上,[[NSUserDefaults standardUserDefaults] setFloat: 0.05 forKey:@"firstSliderValue"]; 基本上就是我想要的。我意识到这不是解决问题的最佳方法,但它现在有效。如果有人能展示一个更好的解决方案的例子,那就太好了。
    • 是的,这不是理想的解决方案,但我认为重要的是有人提供了一个答案来说明为什么原始解决方案不起作用。解决此问题的最佳方法是创建一个模型对象,该对象具有“whateverSliderValueRepresents”之类的属性,并从需要它的任何视图控制器和其他类访问它。您可以创建一个全局变量并通过您的 AppDelegate 或共享实例 (cocoanetics.com/2009/05/the-death-of-global-variables) 访问它。
    【解决方案3】:

    不要使用 NSUserDefaults 来存储视图之间的值。那不是它的用途。只需将滑块值从一个视图传递到另一个视图。您可能需要在-prepareForSegue:sender: 中执行此操作。

    当您想在应用程序的新启动之间保存和恢复值时,请使用 NSUserDefaults。

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
        if ([segue.identifier isEqualToString:@"ShowAnotherSlider"]) {
            DBAnotherViewController *destinationViewController = (DBAnotherViewController *)segue.destinationViewController;
            destinationViewController.sliderStartValue = self.slider.value;
        }
    }
    

    请注意,我在目标视图控制器上设置了一个属性,而不是直接设置滑块值。

    @property (nonatomic, strong) CGFloat sliderStartValue;
    

    此时可能没有加载目标视图控制器的视图,因此滑块属性为 nil。改为设置此其他属性,然后在加载视图时 (-viewDidLoad),您可以使用该值更新滑块。

    - (void)viewDidLoad
    {
        [super viewDidLoad];
    
        self.slider.value = self.sliderStartValue;
    }
    

    【讨论】:

    • 感谢您的信息。我是初学者,我的代码基于这个问题 (stackoverflow.com/questions/24170781/…) 中给出的解决方案。你介意给我一些示例代码吗?
    • 除了这种方式,您会增加不必要的复杂性。您需要在使用滑块返回 ViewController 之前公开该属性并在用户可能经过的每个 ViewController 中传递正确的值。这会产生一些问题,例如不知道是否设置了 sliderStartValue 属性以及设置了不正确的初始滑块值。
    【解决方案4】:

    正如 Dave Batton 所说,NSUserDefaults 用于应用程序新启动时的默认设置。如果我正确理解了您的问题,在我看来,您正在覆盖 firstSliderValueChange 中的默认值。这就是发生这种情况的原因:

    滑块从我上次运行应用程序时设置的位置开始。

    要么分别存储您的默认值和应用内值,要么在视图之间传递它们。

    编辑: 您在下面的评论中提到的代码不传递值。它坚持价值观。

    问题:假设您最初将滑块值默认设置为 0。当您第一次运行应用程序时,您会看到滑块为 0。现在您将滑块移动到 5。然后调用此方法:

    - (IBAction)firstSliderValueChange:(id)sender {
        [[NSUserDefaults standardUserDefaults] setFloat:[_firstSlider value] forKey:@"firstSliderValue"];
    }
    

    现在默认值不再是 0。它是 5。并且在应用程序启动之间仍然存在,因为您使用的是 NSUserDefaults。

    解决方案:将动态滑块值保存在其他位置 - 不在 NSUserDefaults 中。由于您有多个视图控制器,因此一种方法是:

    //viewController.m
    @interface
    @property (strong, nonatomic) IBOutlet UISlider *mySlider;
    @end
    
    -(void)prepareForSegue: (UIStoryboardSegue *)segue sender:(id)sender {
    if([segue.identifier isEqualToString: @"segueIdentifer"]) {
        otherViewController *ovc = (otherViewController *)segue.destinationViewController;
        ovc.dynamicSliderValue = self.mySlider.value;
        }
    }
    

    还有:

    //otherViewController.h
    @interface
    @property(assign) CGFloat dynamicSliderValue;
    @end
    

    现在,每当您切换回第一个视图控制器的视图时,只需访问此属性,并相应地更新滑块。 注意 - 我相信还有很多其他方法可以做到这一点!

    【讨论】:

    • 我的代码基于另一个问题的答案:stackoverflow.com/questions/24170781/… 这是我发现的唯一一个展示如何在视图之间传递值的地方。您能否解释一个更好的方法,让我在应用打开时保留默认值?
    • 当我切换回第一个控制器的视图时,如何访问该属性并更新滑块的值?
    • @PlateReverb 查找展开转场。基本上,当您返回原始视图控制器时,将专门调用自定义方法。在此方法中,使用 setValue 方法更新滑块值。
    • @PlateReverb 这解决了您的问题吗?您还可以使用如 herehere 所示的委托。如果我(或其他任何人)的答案对您有所帮助,我建议您将其投票/标记为答案!
    猜你喜欢
    • 2015-08-15
    • 2012-08-08
    • 1970-01-01
    • 1970-01-01
    • 2013-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多