2015-09-18 46 views
1

我想我使用的协议不应该工作......但它确实如此。有人可以告诉我,我在做什么好吗?可以委托申请两个VC

比方说,我的应用程序有三个视图控制器:的MainView,SecondaryView,EditorView。 EditorView具有应该在其他视图中运行代码的按钮。我有一个协议,允许我远程触发功能。

这是奇怪的事情,我正在做的事情,也许我不应该......但它的工作原理:MainView和SecondaryView都符合相同的协议。我不明白它为什么可行,但它确实如此。

当我在MainView中并加载EditorView并且例如单击“添加”时,MainView中的代码将运行并运行。

当我在SecondaryView中,并加载EditorView并单击“添加”时,SecondaryView中的代码将运行并运行。

问题

如果这是正常的,它怎么搞清楚(主VS中学)委托给哪个?如果不好,为什么它工作?

回答

2

这不仅是好的 - 它很棒。你已经发现了协议的主要优点之一。

EditorView你有一个delegate属性(你可能已经把它命名为别的东西):

weak var delegate : EditorProtocol? 

也有一些代码某处MainViewSecondaryView,看起来像:

let editor = EditorView() // or perhaps you get it in prepareForSegue(_:sender:) 
editor.delegate = self 

这告诉EditorView与哪个对象进行通信。

然后内EditorView调用代码,如:

delegate?.doSomething() 

如果创建了这个编辑器MainView,然后delegateMainView。否则,这是一个SecondaryView

当您将delegate(或任何您命名它)设置为特定对象时,这就是EditorView将与之通信的内容。

+0

这不是很好的例子,当用户忘记设置委托值,应用程序必须崩溃 –

+0

@LokeshDudhat这是一个很好的例子,它实际上回答了这个问题。而忘记设置委托不会导致崩溃。当然,该应用程序可能无法正常工作,但不会崩溃。 – rmaddy

+0

现在这是完整的答案 –