3

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

据我了解,我不想使用选项卡栏应用程序布局,因为通常用户不希望不同选项卡式视图之间的信息相同,因此我正在考虑为此使用分段控制器。要获取视图之间共享的字符串、整数和浮点数,可以在 AppDelegate 中声明它们吗?我读过我可以使用单例,但我们还没有在我的课堂上介绍过,所以我认为这可能只会增加比我需要的复杂性更多的复杂性。如果我要在 AppDelegate 中声明它们,我是否必须在其中综合它们AppDelegateViewController.m以使它们始终可用?我无法想象我必须为每个不同的 ViewController 合成它们。还是NSUserDefaults非常适合这种情况?

如果我在 AppDelegate 中声明了一个实例变量,那实际上会使其成为全局变量吗?我知道这违反了封装做法,但这不会对这个应用程序产生太大影响,它不会出现在 App Store 中,考虑到这将是一个相对较小的应用程序,开销不应该有很大的不同.

提前谢谢大家。祝你的决赛好运,如果你仍然有他们接近!


编辑


我想我应该说这将是一个糟糕的、糟糕的应用程序,我们没有涵盖很多更高级的主题,比如 iOS 的 MVC 范例,所以我能做的非常有限与我们应该做的相比。愚蠢的课程,当我真的可以自己学习并更好地理解Objective-C(我们什么都没学过)以及对iOS框架的更好理解时,我后悔报名了。

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

4

5 回答 5

4

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

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

于 2011-12-12T17:06:31.437 回答
2

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

但是,由于这是一个小型应用程序(当您正在学习基础知识时),在应用程序委托中实现这几个变量不会造成伤害,并且可能会更容易一些。

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

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

保存到 nsuserdefaults:

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

从 nsuserdefaults 检索:

NSString *howManyDrinks = [[NSUserDefaults standardUserDefaults] objectForKey:@"howManyDrinks"];
于 2011-12-12T17:16:49.367 回答
0

您可以使用 Objective C 中的协议来利用委托模式的功能。

于 2011-12-12T17:35:42.963 回答
0

您还可以将这些值存储在 plist 中,然后可以从应用程序中的任何位置访问和编辑。它比单例更容易实现。而且由于您可以在 XCode 中直观地设置 plist,因此对于初学者来说相对容易。我什至为我的 plist 创建了一个包装器,以使编辑数据变得简单。这是 plists 的教程。

于 2011-12-12T20:00:23.967 回答
0

我还不是这方面的专家,但我一直在使用单例,里面有一个对象。据我所知,该对象内部的值是保留的。要创建单例,您需要执行以下操作:

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

+ (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];

确保在要使用它的视图控制器中包含 SharedInfo.h。

我希望这会有所帮助。

于 2015-12-29T16:35:11.733 回答