从一个视图控制器到另一个视图控制器有多少种数据传递方式?

时间:2015-07-22 10:07:31

标签: objective-c

我知道一种类型是segue,现在想尝试另外一种方法在两个viewControllers之间传递数据。如果有人知道,请帮助我做。

1 个答案:

答案 0 :(得分:0)

首先:这种Q有一个问题:两种(不同的)方式是什么?等价的方式如此计为1.例如,我会考虑使用点符号在目标中设置属性,或者使用显式setter以相同的方式,即使代码不是按位相同的。

然而,......

一个。设置隔离的属性

当目标视图控制器(dvc)需要一些数据时,显然可以通过设置属性来传递它:

dvc.property1 = …;
dvc.property2 = …;

对我而言,这只是一种独立的方式,属性设置。 (点符号,KVC,对象订阅,显式setter,$ whatever。)对我而言,当你从segue获得dvc或者自己实例化时,它仍然是相同的:使所有方法等效的核心是源视图控制器显式设置dvc所需的所有数据。

DVC* dvc = segue.destinationViewController;
dvc.property1 = …;
dvc.property2 = …;

......或......

DVC* dvc = [[DVC alloc] initWithNib:… bundle:…];
dvc.property1 = …;
dvc.property2 = …;

我知道别人说,这有两种方式。我不这么认为。 传递数据是等效的,即使获取视图控制器也是不同的。但是,是否计算额外+1。

到目前为止,对我来说更重要的是你得到的依赖。这样,dvc确定要传递的属性集。 svc取决于dvc的API。 dvc中此set的任何更改都会导致svc发生变化。请注意,也许dvc本身不需要数据,但必须知道将它传递给第三个视图控制器,我们称之为3vc(即概述 - >详细信息 - >更多详细信息)。

在这种情况下,DVC具有高度可重用性,因为它没有依赖性,但SVC严重依赖于DVC的API。

B中。设置数据集

对我来说,另一种方法是设置一个数据集实例,可能是一个模型对象,与dvc使用的属性无关。

DVC* dvc = segue.destinationViewController;
Data *data = [Data new];
data.property1 = …;
data.property2 = …;
dvc.data = data;

在第一个视图中,这看起来像(A),其中包含Data实例的一些额外工作。但事实并非如此。一个例子:你有一份人员名单。每个人都有一个电子邮件地址列表。 svc显示了这些人。您可以转到显示此人详细信息的详细视图,其中包括一个电子邮件地址。你可以到3vc查看所有电子邮件地址列表。

在这样的应用程序中,你已经有了类作为你的模型,i。即PersoneMailAdress。只需将选定人员传递给dvc,dvc就可以将同一个人传递给3vc。您只需将入口点传递给模型,并且每个后续视图控制器都会根据模型中的关系选择所需的数据。

DVC* dvc = segue.destinationViewController;
Person *person = …;
dvc.person = person;

dvc的API很少会在这种情况下发生变化。 svc和dvc与数据提供者之间存在正式的依赖关系,但由于变化频率较低,这种依赖关系并没有受到影响。此外,如果模型发生变化,您只需要更改处理此更改的视图控制器,这是非常自然的。但是您不需要更改svc,因为更改Person后dvc需要额外的数据。变更保存在本地。

℃。使源视图控制器成为数据提供者

另一种方法是简单地将svc用作数据提供者。依赖性类似于(A),因为dvc确定API,在这种情况下由svc提供。因此,如果要传递的数据的计算速度很慢并且并不总是需要数据,则存在技术差异。它让你更懒惰。

d。使用全局对象

/ *故意留空* /