Objective c 在objective c中的两个ViewController之间共享对象
我猜这可能是一个愚蠢的初学者问题,但我想不出答案。我的iphone应用程序中基本上有两个视图控制器,我希望它们共享第三个类(.m和.h),该类可以保存双方都应该使用的数据。例如,让我们假设两个视图都显示位置并显示一个表,其中一些信息是经过处理的——我想做的是使用第三个类,如引擎,来完成所有这些,这些视图将只是实例化这个引擎,并在需要时读取表/位置数据 我的问题是-如何在两个视图中实例化这个引擎,但实际上只有一个引擎副本,这两个视图都从中读取。我知道当实例化两次时,会创建两个副本,我不希望这样。我希望使这个引擎“全球化” 在目标c中,这可能吗?最好的办法是什么Objective c 在objective c中的两个ViewController之间共享对象,objective-c,xcode,class,uiviewcontroller,Objective C,Xcode,Class,Uiviewcontroller,我猜这可能是一个愚蠢的初学者问题,但我想不出答案。我的iphone应用程序中基本上有两个视图控制器,我希望它们共享第三个类(.m和.h),该类可以保存双方都应该使用的数据。例如,让我们假设两个视图都显示位置并显示一个表,其中一些信息是经过处理的——我想做的是使用第三个类,如引擎,来完成所有这些,这些视图将只是实例化这个引擎,并在需要时读取表/位置数据 我的问题是-如何在两个视图中实例化这个引擎,但实际上只有一个引擎副本,这两个视图都从中读取。我知道当实例化两次时,会创建两个副本,我不希望这样。我
谢谢大家 > P>你可以考虑向你的模型(“引擎”)对象的两个视图控制器添加一个<代码> <代码>。创建视图控制器时,可以将该属性设置为指向模型。如果
@property
是retain
,那么它将不会复制模型。因为您只有一个“引擎”,我建议您选择单件路线
创建一个静态方法,将实例返回给要共享的对象,然后可以在每个类中使用该方法
请原谅我的语法。。。我面前没有我的objective C的东西,但基本上你会想做如下的事情
EngineClass.h file:
STATIC EngineClass * getSingleton();
STATIC EngineClass * INSTANCE;
EngineClass.m file:
STATIC EngineClass * getSingleton()
{
if(INSTANCE == null)
{
INSTANCE = new EngineClass();
}
return INSTANCE;
}
在这个问题上你有很多选择。遵循MVC方法,您应该拥有该数据(模型)的单个副本,这是正确的。如何将其传送到视图控制器取决于您。我将给出两种方法,您可以看到哪种方法在您的情况下更有效,但实现这一点的方法不止这些。选项1)创建一个单件来存放模型/数据。您可能在SDK中看到过这一点,在使用诸如…=[SomeController sharedInstance]。两个视图控制器只能使用共享的Instance。选项2)您可以在启动时在某处实例化模型,并将其直接传递给视图控制器。他们不关心是否单身。他们只知道他们可以访问一些数据。您可以为每个视图控制器创建@property(nonatomic,retain)the data*the data这样的属性,并以这种方式传递它。我喜欢在启动时实例化它(比如,appDelegate?),然后传递它-但是,我如何“传递”它?它本质上与单例相同,但是视图控制器本身并没有调用Data*TheData=[TheData sharedInstance],而是有一个属性将此属性分配给它们。应用程序委托可能是执行Data*TheData=[TheData sharedInstance]的人,您可以将数据传递给第一个视图控制器。视图控制器依次将其传递给下一组控制器,等等+1非常感谢,Adrian,尽管我还不能100%确定该控制器的实现。你能给我举个例子让我看看佩雷斯吗?我不确定如何将数据从AppDelegate“传递”到下一个视图,等等。假设我在AppDelegate中声明了data*TheData=[TheData sharedInstance]——如何将其“传递”到视图控制器?您的视图控制器是一个常规对象,所以只需创建@property(非原子,保留)数据*其中的数据和您的应用程序代理可以执行以下操作:视图控制器。数据=数据;如果您的应用程序代理正在将navigationController从nib分配给self.window.rootViewController,则这可能会造成混淆。在这种情况下,为什么不将代码从app delegate移动到根视图控制器。但是如果我这样做,我只能从该对象读取,而不能以一种到处都会反映的方式写入该对象,不是吗?