【问题标题】:Setting a view's background using a color saved in NSUserDefaults使用保存在 NSUserDefaults 中的颜色设置视图的背景
【发布时间】:2013-08-03 21:01:48
【问题描述】:

我有一个主视图控制器、一个“更改背景颜色”视图控制器和一个详细视图控制器。

当用户通过更改背景颜色视图控制器更改背景颜色时,我会执行以下操作:

 NSData *colorData = [NSKeyedArchiver archivedDataWithRootObject:currentColor];
 [[NSUserDefaults standardUserDefaults] setObject:colorData forKey:@"backgroundColor"];
 //currentColor is specified by user

这通过以下方式更新到其他视图控制器:

NSData *colorData = [[NSUserDefaults standardUserDefaults] objectForKey:@"backgroundColor"];
UIColor *color = [NSKeyedUnarchiver unarchiveObjectWithData:colorData];
self.view.backgroundColor = color;

我遇到的问题是主视图控制器首先加载。目前,当应用程序第一次加载时,所有内容都有一个白屏。我的问题是:我将如何更改它,以便应用程序在每个视图控制器上加载绿​​色,并且在用户指定颜色后,它停止显示绿色并开始显示指定的颜色?

我尝试使用 viewDidLoad 进行此操作,但这不起作用,因为它只会覆盖 NSUserDefaults 设置。

【问题讨论】:

  • 每次更改后你记得synchronize你的NSUserDefaults吗?
  • 不,我没有这样做。那是什么?
  • 将您的更改写入磁盘。
  • EXC_BREAKPOINT?尝试重新启动 Xcode?重启设备?牺牲一只鸡?有点不对劲。
  • 哈哈,因为我使用 UIColor 而不是 NSData。 NSUserDefaults 不接受 UIColor

标签: ios objective-c cocoa-touch nsuserdefaults


【解决方案1】:

-[NSUserDefaults registerDefaults:] 是您想要的。你用你想成为“默认值”的值来调用它,然后其他调用者将获得这些值。 Reference here.你会希望它在你的应用生命周期的早期运行,可能在– application:didFinishLaunchingWithOptions:

【讨论】:

  • 问题,更改颜色后默认会被永久覆盖吗?
  • 是的。当您随后调用setObject:forKey:(并调用synchronize)时,该值将被写入磁盘并从那时起将在默认值上使用(直到您通过使用不同的值调用setObject:forKey:removeObjectForKey:来更改它)。
  • 你能检查一下主帖吗..我有一个问题
【解决方案2】:

至于您打算每次将背景设置为绿色,直到用户在您的颜色选择视图中选择一种颜色,您希望每次应用程序加载到前台或每次启动应用程序时都执行此操作?我想你可以在你的 IB 文件中设置它(如果你正在使用 IB)或者viewDidLoad 应该可以工作。

如果我理解您正在尝试正确执行的操作,您可以在 NSUserDefaults 中创建另一个项目来跟踪用户何时进行颜色选择,然后您只需在 viewDidLoad 中检查此标志在将背景设置为所选颜色之前。但是我问你何时想这样做的原因是要知道何时重置该标志。

【讨论】:

  • 对不起,如果我不清楚。基本上,如果没有选择其他颜色,我只希望显示 greenColor。选择另一种颜色后,不再使用 greenColor。我认为您关于在 NSUserDefaults 中创建另一个项目来跟踪它的想法可能是个好主意。我会试试的
  • @EvilAegis 听起来像是标准的默认设置设置。在这种情况下,最好使用@ipmcc 的答案,即使用registerDefaults
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-13
  • 1970-01-01
  • 2021-03-11
  • 2011-01-11
  • 1970-01-01
  • 2011-11-18
  • 1970-01-01
相关资源
最近更新 更多