保存/加载 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中的用户默认值
如何在 plist 文件中为 UIColor 设置默认的 NSUserDefaults 值?