在ios应用程序中共享字符串和变量

时间:2011-12-12 16:54:29

标签: iphone objective-c ios data-sharing

我正在为类的最终项目制作一个应用程序,我需要在我的应用程序中的不同视图中共享字符串,整数和浮点数。我必须创建一个服务员/女服务员将在工作中使用的应用程序。我需要针对不同类型的商品订购不同的观点(饮料,开胃菜,主菜等),并且需要保持所选择的商品,每个商品的价格和数量可以访问不同的视图,以保持每个视图中的运行总数(每种类型的项目的一个视图),最后是一个显示已订购内容的明细列表加上总数的视图。

根据我的理解,我不想使用标签栏应用程序布局,因为通常用户不希望不同标签视图之间的信息相同,所以我考虑使用分段控制器。要获取字符串,视图之间共享的整数和浮点数可以在AppDelegate中声明它们吗?我已经读过,我可以使用单身,但我们没有在课堂上介绍过这些,所以我认为这可能会增加比我需要的更多的复杂性。如果我要在AppDelegate中声明它们,我是否必须在AppDelegateViewController.m中合成它们才能使它们全部可用?我无法想象我必须为每个不同的ViewController合成它们。或者NSUserDefaults是否适合这种情况?

如果我在AppDelegate中声明了一个实例变量,它实际上会使它成为一个全局变量吗?我知道这是反对封装实践,但这不会对这个应用程序产生很大的影响,它不会在App Store中,并且开销不应该产生很大的不同,因为这将是一个相对较小的应用程序

先谢谢大家。祝你的决赛好运,如果你仍然接近它们的话!


修改


我想我应该说这将是一个笨拙,糟糕的应用程序,我们没有涵盖很多更高级的主题,如iOS的MVC范例,所以我很有限的东西我可以做的比较我们应该做的。愚蠢的课程,我很遗憾在我真正能够解决这个问题的时候报名参加,并且对Objective-C有了更好的理解,我们没有学到任何东西,也更好地理解了iOS框架。

基本上,如果我在AppDelegate中声明变量,即使它是一个失礼,是否可以从不同的视图访问字符串等?或者NSUserDefaults在这种情况下是更好的解决方案吗?我倾向于NSUserDefaults并在项目ViewController中声明它们。

5 个答案:

答案 0 :(得分:4)

典型的Objective C MVC解决方案是将所有相关的共享字符串和变量放入Model对象(为此对象创建一个新类)作为属性。然后与需要访问这些变量或字符串的所有控制器共享该Model对象。

使用AppDelegate作为模型对象是“过度共享”,并使应用程序委托与非委托相关的东西混乱。一个稍微更清晰的解决方案是让app delegate将getter保存到整个应用程序中广泛使用的Model对象。可能导致代码重用问题并且在其他方​​面被认为是政治上不正确的解决方案是将模型对象和/或共享变量本身分配给C全局变量(小心保留)。 (但是,如果你关心这些事情,这通常会产生最快和最少量的代码。)

答案 1 :(得分:2)

正如hotpaw2所说,使用独特的模型类是最好的方法。

但是,因为这是一个小应用程序(当你学习基础知识时)在app代理中实现这些少数变量不会受到伤害,也许会更容易一些。

如果应用程序增长,那么您可能希望将模型移出应用程序委托并进入自己的类。

更简单,更简单的方法是将这些少量数据存储在nsuserdefaults中:

保存到nsuserdefaults:

[[NSUserDefaults standardUserDefaults] setObject:howManyDrinks forKey:@"howManyDrinks"];
[[NSUserDefaults standardUserDefaults] synchronize];

从nsuserdefaults中检索:

NSString *howManyDrinks = [[NSUserDefaults standardUserDefaults] objectForKey:@"howManyDrinks"];

答案 2 :(得分:0)

您可以使用目标C中的协议来使用委托模式的工具。

答案 3 :(得分:0)

您还可以将这些值存储在plist中,然后可以在app中的任何位置访问和编辑这些值。它比单例更容易实现。由于您可以在XCode中直观地设置plist,因此初学者相对容易。我甚至为我的plist创建了一个包装器,使编辑数据变得简单。 Here's a tutorial for plists.

答案 4 :(得分:0)

我还不是这方面的专家,但我一直在使用单身,里面有一个物体。据我所知,该对象内的值被保留。要创建一个单身人士,你可以这样做:

创建一个普通的Object,并将其添加到头文件中:

+ (id)sharedManager;

然后在.m文件中添加:

+ (id)sharedManager {
    static SharedInfo *sharedMyManager = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedMyManager = [[self alloc] init];
    });
    return sharedMyManager;
}
- (id)init {
    if (self = [super init]) {
        self.myStuff = [[NSMutableDictionary alloc]init];
  //This is where you initialise your variables. The example above is for a 
 //property that I have declared in the .h file
    }
    return self;
}

然后,在整个应用中,您都会使用此功能:

[[[SharedInfo sharedManager] myStuff] addObject: SomethingTocreate];

确保在要使用它的viewcontroller中包含SharedInfo.h。

我希望这有帮助。