保存/加载 UIColor 用户选择默认值

Posted

技术标签:

【中文标题】保存/加载 UIColor 用户选择默认值【英文标题】:Save/Load UIColor User Choice Defaults 【发布时间】:2014-11-16 03:45:24 【问题描述】:

从下面的屏幕截图中可以看出,我有一个倒计时时钟,我允许用户更改 UI 上按钮和标签的颜色。我的问题是,我希望用户能够保存他们的颜色设置,但是我无法弄清楚放置和顺序。我知道这个问题已经在这里得到了回答:Saving UIColor to and loading from NSUserDefaults。

但是,我想我没有“明白”,需要额外的帮助。所以下面截图中的每种颜色都有这样的编码:

-(IBAction)red

    [_enterDateOutlet setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
    [_backButtonOutlet setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
    _yearsLabel.textColor = [UIColor redColor];
    _daysLabel.textColor = [UIColor redColor];
    _hoursLabel.textColor = [UIColor redColor];
    _minLabel.textColor = [UIColor redColor];
    _secLabel.textColor = [UIColor redColor];
    minuteProgessView.theme.labelColor = [UIColor redColor];
    secondProgessView.theme.labelColor = [UIColor redColor];
    hourProgessView.theme.labelColor = [UIColor redColor];
    dayProgessView.theme.labelColor = [UIColor redColor];
    yearProgessView.theme.labelColor = [UIColor redColor];

我的问题是我是否将此代码放在每个颜色操作按钮的末尾(我有 7 种颜色)?

NSData *colorData = [NSKeyedArchiver archivedDataWithRootObject: color];
[[NSUserDefaults standardUserDefaults] setObject:colorData forKey:@"color1"];

因为这是我认为我应该做的,然后我将它添加到我的 View Did Load 方法中:

NSData *colorData = [[NSUserDefaults standardUserDefaults] objectForKey:@"myColor"];
UIColor *color = [NSKeyedUnarchiver unarchiveObjectWithData:colorData];

结果是红色错误,因为“颜色”是未声明的标识符。

非常感谢您的帮助,我是新手,过去 2 个小时一直在尝试解决这个问题。谢谢你。

【问题讨论】:

当使用设置颜色是所有标签的颜色?您不必只保存设置的颜色而不是多种颜色,否则我错过了什么? @Yan 它将设置所有颜色。主要原因是如果用户选择的背景照片会导致倒计时被蒙蔽,他们可以更改颜色以使所有内容重新显示。因此,如果用户选择了背景照片并且黄色最适合他们,并且他们选择了黄色,我希望它可以保存他们的选择,以便下次打开应用程序时使用。 所以你只需要保存选择的颜色,当用户下次打开应用程序时你会检索它并设置它。你不保存其余的颜色 【参考方案1】:

我认为你可以做这样的事情。创建一个方法,该方法将调用一个函数来设置颜色并将颜色传递给它。在这种方法中,您会将颜色保存为用户默认值。当用户返回viewDidLoad 中的应用程序时,它将检索颜色并设置它。我的 Xcode 目前正在崩溃,所以我无法运行它。让我知道这是否是您正在寻找的。​​p>

-(IBAction)red


    [self setAllTo:[UIColor redColor]];

-(IBAction)green
    

        [self setAllTo:[UIColor greenColor]];
    

-(void)setAllTo:(UIColor *)color

    [_enterDateOutlet setTitleColor:color forState:UIControlStateNormal];
        [_backButtonOutlet setTitleColor:color forState:UIControlStateNormal];
        _yearsLabel.textColor = color;
        _daysLabel.textColor = color;
        _hoursLabel.textColor = color;
        _minLabel.textColor = color;
        _secLabel.textColor = color;
        minuteProgessView.theme.labelColor = color;
        secondProgessView.theme.labelColor = color;
        hourProgessView.theme.labelColor = color;
        dayProgessView.theme.labelColor = color;
        yearProgessView.theme.labelColor = color;
        NSData *colorData = [NSKeyedArchiver archivedDataWithRootObject:color];
        [[NSUserDefaults standardUserDefaults] setObject:colorData forKey:@"myColor"];
        [[NSUserDefaults standardUserDefaults] synchronize]         
    


- (void)viewDidLoad

    [super viewDidLoad];

    NSData *colorData = [[NSUserDefaults standardUserDefaults] objectForKey:@"myColor"];
    UIColor *color = [NSKeyedUnarchiver unarchiveObjectWithData:colorData];
    if(color)
          [self setAllTo:color];
    else
         [self setAllTo:[UIColor whiteColor]]; //default color
    

【讨论】:

我的朋友!你不仅在我的应用程序中减少了很多编码,而且让我非常高兴!它不会做的一件事是加载任何progress.theme.labelColors ....如果我在视图中再次点击颜色,它会将进度主题标签更改为红色,但如果我退出并返回,这是唯一不保持红色的东西。有什么想法吗? 我通常喜欢通过属性 (self.variableName) 使用访问变量,而不是 _ 您可能必须将 _ 与所有变量一起使用。 _minuteProgressView.theme.labelColor 等...让我知道这是否有效 废话,发现了问题,实际上我在 viewdidload 下方的标签颜色默认为白色!颜你真是个天才!非常感谢你!我会记住你的脸,如果我在这个疯狂的世界里看到你,我会请你喝啤酒!干杯! 我很高兴能帮上忙! :)) 祝你编码愉快! 正如您提到的设置默认颜色,我意识到如果用户默认设置中没有保存任何内容,则应该添加更多行来设置默认颜色。否则可能会导致程序崩溃。

以上是关于保存/加载 UIColor 用户选择默认值的主要内容,如果未能解决你的问题,请参考以下文章

如何从图像文字数组中选择单个图像并将其保存为swift 5中的用户默认值

未选择任何内容时将默认值保存在组合框中c#

如何在 plist 文件中为 UIColor 设置默认的 NSUserDefaults 值?

如何在没有参数的情况下快速将类保存到用户默认值

文本字段值已更新并保存,但当再次加载表单并单击按钮时,字段会重置为默认值

具有已发布枚举的用户默认值