Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 在objective c中的两个ViewController之间共享对象_Objective C_Xcode_Class_Uiviewcontroller - Fatal编程技术网

Objective c 在objective c中的两个ViewController之间共享对象

Objective c 在objective c中的两个ViewController之间共享对象,objective-c,xcode,class,uiviewcontroller,Objective C,Xcode,Class,Uiviewcontroller,我猜这可能是一个愚蠢的初学者问题,但我想不出答案。我的iphone应用程序中基本上有两个视图控制器,我希望它们共享第三个类(.m和.h),该类可以保存双方都应该使用的数据。例如,让我们假设两个视图都显示位置并显示一个表,其中一些信息是经过处理的——我想做的是使用第三个类,如引擎,来完成所有这些,这些视图将只是实例化这个引擎,并在需要时读取表/位置数据 我的问题是-如何在两个视图中实例化这个引擎,但实际上只有一个引擎副本,这两个视图都从中读取。我知道当实例化两次时,会创建两个副本,我不希望这样。我

我猜这可能是一个愚蠢的初学者问题,但我想不出答案。我的iphone应用程序中基本上有两个视图控制器,我希望它们共享第三个类(.m和.h),该类可以保存双方都应该使用的数据。例如,让我们假设两个视图都显示位置并显示一个表,其中一些信息是经过处理的——我想做的是使用第三个类,如引擎,来完成所有这些,这些视图将只是实例化这个引擎,并在需要时读取表/位置数据

我的问题是-如何在两个视图中实例化这个引擎,但实际上只有一个引擎副本,这两个视图都从中读取。我知道当实例化两次时,会创建两个副本,我不希望这样。我希望使这个引擎“全球化”

在目标c中,这可能吗?最好的办法是什么


谢谢大家

> 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移动到根视图控制器。但是如果我这样做,我只能从该对象读取,而不能以一种到处都会反映的方式写入该对象,不是吗?