通常,只要可以运行,我会以任何随机方式将其组合在一起,但这意味着我不会关注任何设计模式。我的应用程序当前广泛使用全局变量(我在每个 View Controller 中携带AppDelegate的实例来访问在AppDelegate.h中声明的属性)。尽管它可以实现我想要的功能,但我已经读过这不是一个好的设计实践。

因此,我想开始制作我的代码“legit”。但是,我现在无法想象没有全局变量的应用程序。它们对应用程序的健康至关重要,但这必须表示我做错了,对吧?我简直无法想象我还会怎么做。以这个为例:

您在这里有两个 View Controller ,SideViewControllerMainViewController。使用全局变量,例如说整个应用程序是否有一个SideViewControllerMainViewController共享实例(appDelegate.sideViewControllerappDelegate.mainViewController),我可以轻松地在两个 View Controller 之间进行通信,这样,如果我在SideViewController中按“News Feed”,就可以告诉我的MainViewController重新加载它的 View 。

但是,我无法想象,如果这些不是全局变量,将如何进行呢?如果SideViewController中发生事件,我该如何以符合设计标准的方式通知MainViewController

最佳答案



现在,您以相同的方式进行操作,只是SideViewController从不同的地方获取了对MainViewController的引用。

这两个 View Controller 是如何创建的?它很可能以两种方式之一发生:

  • 对象之一创建另一个。在这种情况下,MainViewController可能会创建SideViewController。
  • 其他一些对象(例如应用程序委托(delegate)或另一个 View Controller )都创建了它们。

  • 在第一种情况下,MainViewController创建后便会立即引用SideViewController。它可以将该引用存储在其自己的实例变量之一中,以便始终可以向其创建的SideViewController发送消息。类似地,MainViewController可以给SideViewController自己一个引用(即对MainViewController的引用),SideViewController可以存储该引用并在将来与它的MainViewController进行通信。

    第二种情况是相似的-如果应用程序委托(delegate)(或其他一些对象)同时创建MainViewController和SideViewController,则该对象会知道这两个对象,并且可以使用彼此的引用进行配置。

    在这两种情况下,所讨论的对象都能够像以前一样轻松地相互通信,并且不需要全局变量。

    上面我已经解释了,也许是完成您所要求的最简单的方法-两个对象之间的通信。有多种模式可用于改善这些对象之间的关系,以使您的代码更好:
  • 委托(delegate):给SideViewController一个委托(delegate)属性,并定义一些协议(protocol)来建立SideViewController对委托(delegate)的期望。在MainViewController中实现该协议(protocol)。使您的MainViewController实例成为SideViewController的委托(delegate)。 SideViewController不需要确切知道其委托(delegate)的类型是什么,它只在乎委托(delegate)是否实现了所需的协议(protocol)。如果有机会的话,这可以很容易地将SideViewController与MainViewController以外的其他东西一起使用,或者在另一个项目中使用它。
  • 通知: SideViewController甚至不需要委托(delegate)-它可以简单地将有关某些事件的通知广播到碰巧正在监听的任何对象。如果一个以上的对象可能需要了解SideViewController中发生的事情,或者关心SideViewController Action 的对象可能会更改,则此方法特别有效。
  • MVC:并不是告诉MainViewController某些更改,SideViewController只是更改了模型中的数据。每当MainViewController的 View (或其他任何 View Controller 的 View )出现时, Controller 都会从模型中读取数据并重新显示自身。

  • 如果您有兴趣,您可能想获取一份Erik Buck的 cocoa 设计模式的副本,其中详细解释了这些模式以及许多其他模式。不要觉得您必须一次学习所有内容,否则就麻烦太多了。一次学习一点,看看它如何改善(或不改善)您的项目。

    10-08 17:48