我遇到了在两个(或许多)无关(通过segue)视图控制器之间来回传递数据的挑战。
有三个视图控制器,ViewController A
- ViewController B
和ViewController C
ViewController A
代表ViewController B
和ViewController B
代表ViewController C
。我想在ViewController A
和ViewController C
之间共享数据(例如文本字段上的文字)来回static
经过调查,我发现了四种可能的方法: -
NSUserDefaults
成员创建一个类,以存储textfield中包含的数据。for
实现这一目标最合乎逻辑的方法是什么?我想用最少的开销。 谢谢!
答案 0 :(得分:5)
这个问题有两个解决方案,比委托或默认系统更好(IMO),并且比单例,静态变量,全局变量更好。
<强> 1。将数据传递给 B
。
你有一个像这样的结构:A->B->C
,而C
需要一些A
拥有的数据。所以视图控制器不真的不相关,它们只是没有直接连接。处理此问题的一个好策略是通过通过 B
传递必要的信息。也就是说,A
不一定知道C
,可能不需要知道。并且C
也不需要了解A
。从A
的角度来看,有一项工作要做,并且需要一定数量的信息。因此,A
应在B
segue期间向A->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
情况下,例如您已经获得的情况,您突然无法在B
和{{1}之间插入另一个视图控制器例如,因为新人不知道需要将某些数据从C
传递到B
。
答案是使用数据模型 - 管理应用程序数据的对象或对象集。如果您在一个控制器(例如C
)中生成了一些其他控制器(如C
)所需的数据,则该数据必须对整个应用程序很重要,而不仅仅是单个查看控制器。这正是应该作为数据模型的一部分进行管理的数据类型。如果您这样做,那么您不必担心将大量不同的数据传递给可能需要它的每个视图控制器,或者(例如A
)可能需要将其传递给其他人。您只需传递一件事 - 对数据模型的引用或数据模型的相关部分。
让我们具体说明B
实际上是一个“设置”视图控制器,并且有问题的数据是用户的名字。 C
需要知道名称的更新,以便它可以正确显示。 A
根本不关心这个名字。因此,您设置了某种包含B
属性的Model
类。 username
可以在启动时由应用程序委托实例化,也可以由根视图控制器Model
实例化,并且对模型的引用将传递给视图控制器图形中的每个视图控制器。现在A
可以在用户更改时在模型中设置C
属性。 username
可以读取相同的属性来检索数据 - 实际上,它可以使用KVO来查找它关心的模型的所有更改。 A
不了解A
,反之亦然,您不必为创建另一个委托协议而烦恼,只是传递一些数据。
答案 1 :(得分:0)
在不了解您的具体情况的情况下,委派通常是在VC之间传递数据的最常用方法。委托是典型的“传递数据”模式。
单身人士在你真正需要的是一个经理人课程的情况下表现很好,这对你的应用程序中的某个状态负责。单身人士不太关心“从VC传递数据”,更多的是关于管理状态。
如果事件发生并且您希望其他类处理或响应它,则通知很好。
答案 2 :(得分:0)
我在委托中看到的问题是,当您想要将数据发送到视图控制器A但该视图控制器位于导航控制器堆栈的前端并且您的视图控制器是5 vc时。
我认为为每个vc设置一个协议会很麻烦,比如说:A-> B-&gt; C-&gt; D-&gt; E,其中E和你在哪里你想要发送数据到A b / c A将进行api调用以检索数据然后该数据现在必须将其返回到E ..所以现在你必须有另一组协议来发送数据所有回去的路。
如果你是那么远的兔子洞可能会发送到第一个VC在堆栈上并设置一个公共财产(并发送&#39; self&#39; i..e E所以也许你可以分配该VC的公共属性,供数据使用。