首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在两个无关的ViewControllers之间传递数据

在两个无关的ViewControllers之间传递数据
EN

Stack Overflow用户
提问于 2015-07-31 17:31:27
回答 3查看 1.2K关注 0票数 2

我遇到了一个挑战,要在两个(或多个)无关的视图控制器之间来回传递数据。

有三个视图控制器,ViewController A - ViewController BViewController C.

ViewController AViewController BViewController BViewController C

我希望在ViewController AViewController C之间来回共享数据(例如textfield上的文本)

经过调查,我找到了四种可能的方法:-

  1. 代表团。
  2. 创建一个具有static成员的类,以存储textfield中包含的数据。
  3. 使用NSUserDefaults
  4. 使用全局变量

实现这一目标的最合乎逻辑的方法是什么?我想用开销最小的。谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-07-31 19:02:20

以下是解决这个问题的两种解决方案,一种比委托或默认系统更好(IMO),另一种比单名、静态变量、全局变量好得多。

1.通过B**.** 传递数据

您有一个类似于这样的结构:A->B->C,而C需要一些A所拥有的数据。所以视图控制器并不是完全不相关的,它们只是没有直接连接。处理此问题的一个好策略是通过B传递必要的信息。也就是说,A不一定知道C,也许不需要知道。C也不需要了解A。从A的角度来看,有一项工作需要做,并且需要一定数量的信息来完成。因此,A应该在B segue期间向B提供所有必要的信息。如果B使用C来完成它的部分工作,那很好,但是A并不关心这一点。同样,C也不知道A,甚至B -- C所知道的就是它被赋予了一些数据来完成一项工作。因为是B在实例化(通过segue) C,所以B有责任提供必要的信息。

朝相反的方向发展也是如此。如果C生成A最终需要的数据,B应该在C离开之前从C中检索数据,A应该从B中检索数据。

您需要使A成为C的委托的唯一原因是如果A需要在更新发生时立即发现它们。如果发生这种情况,这可能是一个很好的迹象,你应该继续下一个选择.

2.使用您的数据模型.

很容易忘记,MVC中的M应该是应用程序中的平等合作伙伴。我们通常只是让我们的视图控制器管理所有的数据,然后尝试找出如何让正确的数据通过视图控制器图流到正确的位置。这可能会使您的应用程序变得比它更不灵活:在A->B->C情况下,例如,在BC之间插入另一个视图控制器时,突然被阻止了,因为新的家伙不知道它需要将某些数据从B传递到C

答案是使用数据模型--一个管理应用程序数据的对象或一组对象。如果在一个控制器(在您的情况下是C)中生成了其他控制器(如A)所需的数据,则该数据必须对整个应用程序非常重要,而不仅仅是对单个视图控制器。这正是应该作为数据模型的一部分来管理的数据类型。如果您这样做,那么您就不必担心将大量不同的数据传递给可能需要它的每个视图控制器,或者可能需要将其传递给其他人(如B)。您只需要传递一件东西--对数据模型的引用,或者数据模型的相关部分。

让我们具体说明一下,C实际上是一个“设置”视图控制器,所讨论的数据是用户名。A需要知道名称的更新,这样它才能正确地显示它。B根本不关心这个名字。因此,您设置了包含一个Model属性的某种类型的username类。Model可能在启动时由app委托实例化,或者由根视图控制器A实例化,并将对模型的引用传递给视图控制器图中的每个视图控制器。现在,C可以在用户更改模型时在模型中设置username属性。A可以读取相同的属性来检索数据--实际上,它可以使用KVO来查找它所关心的模型的所有更改。A不了解C,反之亦然,您不必为传递数据而创建另一个委托协议。

票数 5
EN

Stack Overflow用户

发布于 2015-07-31 17:44:58

在不了解具体情况的情况下,委托通常是VC之间传递数据的最常用的方法。委托是典型的“传递数据回”模式。

在您真正需要的是一个管理类的场景中,单例是很好的,它对整个应用程序中的某个状态负责。单例与其说是“从VC中传回数据”,不如说是关于管理状态。

如果一个事件发生了,并且需要一个不同的类来处理它或响应它,那么通知是很好的。

票数 0
EN

Stack Overflow用户

发布于 2016-08-22 04:11:40

我在委托方面看到的问题是,当您希望向视图控制器A发送数据时,该视图控制器位于导航控制器堆栈的前端,而您的视图控制器则是5 vc。

我认为为每个vc设置一个协议会很麻烦,比如: A->B->C->D->E,在这里你和你想要将数据发送到A b/c A将发出一个api调用来检索数据,然后这些数据现在必须返回到E。因此,现在您必须有另一组协议来将数据发送回来。

如果您在那么深的地方,兔子洞可能会使send获得堆栈上的第一个VC,并设置一个公共属性(并发送‘self’i.e.e,这样您就可以将一个公共属性分配给该VC以供数据使用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31751932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档