如何与多个视图控制器iOS共享一个阵列

时间:2014-07-07 15:10:47

标签: ios objective-c arrays

我重视这个网站上的意见,想知道你们的想法。我有一个包含数组的应用程序。此数组用于多个视图控制器。目前,每次打开一个视图控制器时,我都会创建该数组。我不相信这是最好的事情。我之前使用过NSUserDefaults和单身,但我对你有任何想法,plist等等持开放态度。我正在寻求让事情快速有效地运行。

另外,我希望用户能够重新排列阵列。让我们说它从alpha顺序开始。但是用户发现以其他方式重新排列它更好。我知道怎么做,重新排列,但我想知道在哪里保留原始数组,以便用户可以将命令重置回原始的alpha顺序。

所以我猜这个问题是双重的。存储原始数组的位置,以及如何最好地在整个应用程序中访问更改的数组。非常感谢你的帮助。

编辑#1

我要感谢大家的意见和答案!我认为这就是社区的意义所在。学习新的和不同的技术是很棒的。我将尝试尝试所有的答案(看看我是否可以实际编程),看看哪一个最适合我。再次感谢这次出色的对话。

编辑#2

我最终做了两件事,如果没有你的所有评论和答案,我绝不会这样做。我在app delegate中创建了数组并将其保存在用户默认值中。它不是一个基本数组,它是一个自定义对象数组,所以我不得不使用一些NSCoding。它也不只是alpha排序,所以我制作了一个可以操作的数组。再一次,感谢所有伟大的见解!

3 个答案:

答案 0 :(得分:2)

您可以在AppDelegate中创建它的单例实例。 在AppDelegate.h中为数组创建一个@property,然后将该标头导入到其他viewControllers中。

将数组初始化并存储到“didLoadWithOptions”中的appDelegate的数组@property中。您可以创建自定义getter / setter以允许操作。实际数据可能来自外部XML,JSON或plist文件,但为了测试,您只需在AppDelegate中对数组进行硬编码即可。

每个viewController都需要使用描述in this answer的方法来引用appDelegate。然后,您可以像访问任何其他属性一样访问1数组,     NSArray *dataInVC = myAppDelegate.singletonArray;(...或者如果要添加/更改/操作,则使用NSMutableArray。)

...或者,只需为您的数据创建一个单独的类,并创建它的单例版本,以便以后可以在必要时更轻松地重构。如何执行此操作的示例in this answer

答案 1 :(得分:1)

我建议将数组存储在您的app委托中。此解决方案的一个优点是您的应用程序委托已经是单例。

在app delegate头文件中创建NSMutableArray属性。在app delegate didFinishLaunchingWithOptions:方法中初始化并填充数组。

使用以下代码从任何地方访问它:

MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
// appDelegate.myArray holds your values

更进一步,将其添加到Prefix.pch文件中:

#import "MyAppDelegate.h"
#define appDelegate ((MyAppDelegate *)[UIApplication sharedApplication].delegate)

然后可以简化之前的代码,只需从任何地方调用appDelegate.myArray

您可以在应用委托实施中创建处理数组上的排序和其他操作的方法。如果您在app delegate头文件中声明这些方法,您也可以在应用程序的任何位置通过以下方式调用它们:

[appDelegate doStuff:parameter];

答案 2 :(得分:1)

当您从五个不同的地方访问数据时,很快就会混淆地来回发送数据。具有存储数组的公共属性的单例类将是解决此问题的好方法。

如果您想将数据保存到磁盘,NSUserDefaults将是更好的选择。

以下是如何使用NSUserDefaults来执行此操作的方法。保存数据:

[[NSUserDefaults standardUserDefaults] setObject:originalArray forKey:@"OriginalArray"];
[[NSUserDefaults standardUserDefaults] setObject:modifiedArray forKey:@"ModifiedArray"];

检索数据:

NSMutableArray *modifiableArray = [[NSUserDefaults standardUserDefaults] arrayForKey:@"ModifiedArray"].mutableCopy;

请勿忘记在适当的时候拨打[NSUserDefaults synchronize]将数据保存到磁盘。