差异是什么?授权,传递数据,&礼仪礼仪

时间:2015-11-30 18:00:43

标签: ios swift uiviewcontroller

我可以想到我的代码允许ViewControllers进行交互的四种方式:

1。如果我在堆栈中调用新的VC,我会在准备segue时传递它所需的数据,如下所示:

Prepare for segue - passing data

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更简单时,为什么还要使用协议呢?只是为了确保代表符合?

当我不需要委托处理事件时呢?当我只需要传递一个变量值时,该怎么办?这也可以通过以下方式处理:

  • 暂时将单元格保存到CoreData,从其他VC中调用它
  • 或者使用NSUserDefaults
  • 或者我可以使用全局变量来记住单元格

在论坛上,我总是看到有人说不要使用NSUserDefaults,不要使用全局变量,除非" x"等等。那么是否有一个特定的,正确的决策所有这一切的树?

1 个答案:

答案 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可以使用KVOnotification 观察更改模型。

  

代表团怎么样?这是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是启动之间用户首选项的持久性,也不相关。

使用这些而不是上面批准的模式就像使用全局变量一样,但更糟糕的是,因为它们通常被应用为全局变量,只是重命名以模糊不明智的方法。