了解Cocoa Touch中的MVC设计模式

Sno*_*man 5 iphone cocoa-touch objective-c ios

通常我只是随机地组合一个应用程序,只要它有效,但这意味着我不会关注任何设计模式.我的应用程序目前广泛使用全局变量(我AppDelegate在每个视图控制器中都有一个my实例来访问我在我声明的属性AppDelegate.h).虽然它做了我想做的事情,但我读到这不是一个好的设计实践.

所以我想开始使我的代码"合法".但是,我无法想象我的应用程序现在没有全局变量.它们对应用程序的健康非常重要,但这必然意味着我做错了什么,对吧?我无法想象我还会做些什么.以此为例:

在此输入图像描述

这里有两个视图控制器,a SideViewController和a MainViewController.使用全局变量,比如说整个应用程序有一个SideViewControllerMainViewController(appDelegate.sideViewControllerappDelegate.mainViewController)的共享实例,我可以轻松地在两个视图控制器之间进行通信,这样如果我在我的"新闻源"中按下SideViewController,我可以告诉我MainViewController重新加载它视图.

但是,如果不是全局变量,我无法想象如何做到这一点?如果我的事件发生,我SideViewController将如何MainViewController以符合设计标准的方式通知我?

Cal*_*leb 5

但是,如果不是全局变量,我无法想象如何做到这一点?如果我的SideViewController中发生了一个事件,我将如何以符合设计标准的方式通知我的MainViewController?

就像你现在一样,除了SideViewController从不同的地方获取对MainViewController的引用.

这两个视图控制器是如何创建的?它可能以两种方式之一发生:

  1. 其中一个对象创建另一个.在这种情况下,MainViewController可能会创建SideViewController.

  2. 其他一些对象(例如app委托或其他视图控制器)会同时创建它们.

在第一种情况下,MainViewController一旦创建它就会引用SideViewController.它可以将该引用存储在其自己的一个实例变量中,以便它始终可以将消息发送到它创建的SideViewController.类似地,MainViewController可以为SideViewController提供对它自己的引用(即MainViewController),SideViewController可以存储它并在将来使用它与MainViewController交谈.

第二种情况类似 - 如果app委托(或其他一些对象)创建MainViewController和SideViewController,该对象知道两个对象,并可以配置每个对象的引用.

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

我上面解释的可能是完成你要求的最简单的方法 - 两个对象之间的通信.有许多模式可用于优化这些对象之间的关系,以使代码更好:

  • 委托:为 SideViewController提供一个委托属性,并定义一些协议来确定SideViewController对其委托的期望.在MainViewController中实现该协议.使您的MainViewController实例成为SideViewController的委托.SideViewController不需要确切地知道它的委托是什么类型 - 它只关心它的委托实现了所需的协议.如果出现这种机会,可以很容易地将SideViewController与MainViewController之外的东西一起使用,或者在不同的项目中使用它.

  • 通知: SideViewController甚至可能不需要委托 - 它可以简单地将关于某些事件的通知广播到正在收听的任何对象.如果多个对象可能需要了解SideViewController中发生的事情,或者关注SideViewController操作的对象可能会发生变化,则此方法尤其有效.

  • MVC: SideViewController只是更改模型中的数据,而不是告诉MainViewController有什么变化.无论何时出现MainViewController的视图(或任何其他视图控制器的视图),控制器都会从模型中读取数据并重新显示.

如果你有兴趣,你可能想要获得Erik Buck的Cocoa设计模式的副本,它可以非常详细地解释这些模式和许多其他模式.不要觉得你必须立刻学习它,或者这太麻烦了.一次学习一下,看看它如何改进(或不改进)你的项目.