【问题标题】:Store an array of UIViews in NSUserDefaults在 NSUserDefaults 中存储一组 UIViews
【发布时间】:2012-10-17 05:02:27
【问题描述】:

我正在尝试向 NSDefault 添加一个 uiviews 数组,但它似乎没有保留该数组。有谁知道为什么?我还尝试将每个视图存储在 nsvalue 中,然后将其存储在 nsdefault 中,但这仍然不起作用。

NSArray *arr = [[NSArray alloc] initWithObjects:[NSValue valueWithNonretainedObject:myView], nil]];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:arr forKey:@"myKey"];

NSArray *resultArray = [defaults objectForKey:@"myKey"];

结果数组为零!

谢谢

我之所以尝试这样做是因为这些是我的 uitableview 的标题视图。由于创建它们需要时间,我只想创建一次并存储它们以供将来访问。

【问题讨论】:

  • 您为什么要这样做?这不是 NSUserDefaults 的设计目的。如果您描述了您要完成的工作,也许 StackOverflow 可以为您提供更好的方法。
  • 在这种情况下,如何将这些 UIView 转换为 UIImage 并存储在文档文件夹中,以便下次您可以将其添加到 imageView 中。我不确定你是否应该使用 NSUserDefaults 来存储 UIViews。

标签: ios arrays uiview store nsuserdefaults


【解决方案1】:

来自 NSUserDefaults 的文档:

NSUserDefaults 类提供了方便的方法来访问常用类型,例如浮点数、双精度数、整数、布尔值和 URL。默认对象必须是一个属性列表,即以下实例(或集合实例的组合):NSData、NSString、NSNumber、NSDate、NSArray 或 NSDictionary。如果要存储任何其他类型的对象,通常应该将其归档以创建 NSData 的实例。有关详细信息,请参阅首选项和设置编程指南。

如果你想在 NSUserDefaults 中放置一个 UIView(为什么?),你需要先将它归档到一个 NSData 对象中。

但是你需要问问自己为什么要在 NSUserDefaults 中放置一个视图。您应该只在 NSUserDefaults 中放置一些数据。视图显示数据。获取数据后,很容易重新显示视图。考虑将一些需要的数据放在 NSUserDefaults 中。

【讨论】:

  • 是否可以在nsdata中存储uiview?
  • 如果不可能的话,我不会告诉你你需要将视图归档到一个 NSData 对象中。您需要使用 NSKeyedArchiver 来执行此操作。但同样,这是一种非常糟糕的做事方式。这不是 NSUserDefaults 的目的。如果您真的坚持归档视图,至少将其存储在文件中而不是 NSUserDefaults 中。创建这些视图实际上需要多长时间?您认为从存档中重新创建它们会更快吗?
  • 最近对此进行了测试,NSKeyedArchiver 不保证为视图生成的数据将在其离开时的确切状态下取消存档。我尝试使用一些绘图代码和一些 gif Imageviews 尝试这样做,但它没有正确解档
【解决方案2】:

您确定要这样做吗?最好将模型数组存储到数据库或某个文件中,并在需要时从它们重新创建视图。

【讨论】:

  • 我认为加载我的 uiview 标题需要这么多时间的原因是因为他们每次都必须从服务器加载图像。所以我只将这些图像存储到 nsdata 中,并将它们存储在 nsuserdefault 中。所以现在当我想再次访问它们时,它不必从服务器加载图像,因此它现在几乎立即创建标题视图。
  • @Mona 您应该将图像存储到文件中,而不是 NSUserDefaults 中。
  • @Mona NSUserDefaults 仅适用于小型用户设置,图像、模型或其他一些数据必须存储在数据库或文件中。在您的情况下,最好将图像保存到文件中,我建议您使用SDWebImage library,它会为您完成所有工作(内存缓存和磁盘缓存)并且使用起来非常简单。
【解决方案3】:

啊哈!你不是第一个面对这个问题的人。我自己没有遇到过此类问题,但在下面的链接中,是一个包含代码的博客,可让您缓存和重用您的视图。然后,您只需要在启动时重新创建视图。示例代码:

Cache UIViews for re-use in tableview

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-18
    • 1970-01-01
    • 2011-09-05
    相关资源
    最近更新 更多