我可以想到我的代码允许ViewController进行交互的四种方式:
1.如果要在堆栈上调用新的VC,则将准备进行存储时需要的数据传递给它,如下所示:
2.当我反向前进并回到VC时,放松步态对我有帮助。
3.我可以使用协议从另一个VC调用一个VC中的函数。
4.我也有一个名为“ ToolBox”的VC,有时通过执行以下操作来引用“ Toolbox”功能:
var toolBox = ToolBox()
toolBox.fetchReq_taskList_Sorted(currentListEntity)
我想我像通过#1那样通过传递值来初始化我的新VC。我想我理解使用#2展开序列,以便在展开而不是传递数据时运行一个函数。
题
我开始感到困惑的是#3与#4。他们俩都让我委托另一个班级/ VC。当#4更简单时,为什么还要麻烦协议呢?只是为了确保代表符合要求?
当我不需要委托事件处理时该怎么办?当我只需要传递变量的值时该怎么办?也可以通过以下方式处理:
将单元临时保存到CoreData,然后从其他VC调用
或者使用NSUserDefaults
或者我可以使用全局变量来记住单元格
在论坛上,我总是看到有人说不要为此使用NSUserDefaults,除非使用“ x”等,否则不要使用Global变量。那么对于这一切是否有一个特定的正确决策树?
最佳答案
VC负责模型的各个部分。他们通过更改模型对用户操作做出反应,并观察模型中的更改以更新其视图。它们彼此间接通信,因为它们都遵循相同的共享模型。
回顾my answer to your other question,当在表视图中提供模型对象数组的vcA想要告诉vcB在哪个特定对象上进行操作时,可以通过将该对象分配给vcB属性(该对象是vcB模型的一部分)来直接这样做。 ...
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).
看看从vcB到vcA不需要什么“回传”吗?他们俩都在看同一件事。虽然为真,但您的帖子中隐含的一些问题仍未得到解答。
vcA可能需要知道vcB是否更改了模型,因此它可以
更新其视图。 vcB不需要告诉vcA这件事吗?
这是一个很大的话题,但是简短的答案是vcA可以使用KVO和notification观察模型的变化。
委托呢?这是vcs协调的一种方式吗?
是。通知有时过于广播,而KVO有时过于狭窄和冗长。有了委派,vcB对它的代表说:“我将尽我的职责来改变模型的一部分,当我做我要做的事情时,你应该做的就是做任何事。”
关于vc间通信的主题的This highly rated post很好地解释了如何实现委派。
委托有点过分了,imo。我更喜欢将其用于更丰富的交互(
NSURLConnectionDelegate
或UITableViewDatasource
的工作方式),但是在vcs之间使用它来交流有关模型更改的方法是可行的常见做法。“目标动作”模式怎么样?
您没有提到这个,而是另一个模式,代表团的黑客表亲。在自定义UIControl子类之外,我会保持距离。
全局变量呢?他们不好吗?
是。
一个更微妙的答案允许一些常用的答案,包括模型的单例根。但总的来说,出于与不使用木制球杆相同的原因,您应该避免使用球拍:对于大多数(与打棒无关的)工作,弊大于利。
那我的ToolBox类或CoreData或NSUserDefaults呢?
您的ToolBox类可能确实是模型的一部分,也许您只是没有意识到它或以这种方式命名。 CoreData,用于在应用启动之间保持模型的持久性。这里不是很相关。 NSUserDefaults是两次启动之间用户偏好的持久性,也不相关。
使用这些变量来代替上面认可的模式就像使用全局变量一样,只是略有不同,因为它们通常被用作全局变量,仅重命名以掩盖不明智的方法。
关于ios - 有什么不同?委托(delegate),传递数据和协议(protocol)礼节,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34004991/