我可以想到我的代码允许ViewControllers进行交互的四种方式:
1。如果我在堆栈中调用新的VC,我会在准备segue时传递它所需的数据,如下所示:
2。当我正在反向并回到VC时,放松segues帮助我。
3. 我可以使用协议从另一个VC调用一个VC中的函数。
4. 我还有一个名为" ToolBox"的VC。我有时会参考"工具箱"通过执行以下操作来实现:
var toolBox = ToolBox()
toolBox.fetchReq_taskList_Sorted(currentListEntity)
通过传递值来初始化我的新VC,比如#1,我想我理解。使用#2,展开segues,在展开时运行函数但不传递数据,我想我理解。
问题
我开始感到困惑的是#3与#4。他们都让我委托给另一个班/ VC。当#4更简单时,为什么还要使用协议呢?只是为了确保代表符合?
当我不需要委托处理事件时呢?当我只需要传递一个变量值时,该怎么办?这也可以通过以下方式处理:
在论坛上,我总是看到有人说不要使用NSUserDefaults,不要使用全局变量,除非" x"等等。那么是否有一个特定的,正确的决策所有这一切的树?
答案 0 :(得分:1)
VC负责模型的部分内容。他们通过更改模型来响应用户操作,并且他们观察模型中的更改以更新其视图。它们间接地相互通信,因为它们都观察到相同的共享模型。
回顾一下my answer to your other question,当在tableview中呈现模型对象数组的vcA想要告诉vcB要操作哪个特定对象时,它可以通过将该对象分配给vcB&vcB& #39;模特的一部分......
/posts/:post_id/
/comments/comment_id
了解没有必要"传回"什么从vcB到vcA?他们都在看同样的事情。虽然这是真的,但是你的帖子隐含了一些问题......
vcA可能需要知道vcB是否可以更改模型 更新其观点。不是vcB需要告诉vcA吗?
这是一个很大的主题,但简短的回答是vcA可以使用KVO和notification 观察更改模型。
代表团怎么样?这是vcs协调的一种方式吗?
是。通知有时候有点太广播了,而KVO有时候有点过于狭隘和冗长。通过授权,vcB对其代表说:"我将完成改变模型部分的工作,当我做我做的事情时,你应该做你做的任何事情"。
关于跨vc通信主题的This highly rated post可以很好地解释如何实现授权。
代表团有点过分,imo。我更喜欢将它用于更丰富的交互( vcA vcB
| /
vcA's model vcB's model (assigned to it before a segue)
| /
---------------- /
| | | /
obj0 obj1 obj2
Before presenting vcB, vcA assigns it part of the model (obj2, in this example).
或NSURLConnectionDelegate
的工作方式),但在vcs之间使用它来沟通模型更改是常用的做法。
" target-action"图案?
你没有提到这个,但它的另一种模式,代表团的黑客表兄。在自定义UIControl子类之外,我不会离开。
全局变量怎么样?他们不好吗?
是
一个更微妙的答案允许常用的少数,包括模型的单个根。但总的来说,你应该避免使用全局游戏,原因与你不使用木棍相同:对于大多数(非与剑术相关的)工作,它们弊大于利。
我的ToolBox类或CoreData或NSUserDefaults怎么样?
您的ToolBox类可能真的是您模型的一部分,也许您还没有意识到它或以这种方式命名它。 CoreData用于在应用程序启动之间持久化模型。这里不太相关。 NSUserDefaults是启动之间用户首选项的持久性,也不相关。
使用这些而不是上面批准的模式就像使用全局变量一样,但更糟糕的是,因为它们通常被应用为全局变量,只是重命名以模糊不明智的方法。