理解Cocoa的委托 数据源和控制器

有关于Controller(控制器)的说明我把它摘录在下面:
A controller object acts as a coordinator or as an intermediary between one or more view objects and one or more model objects. In the Model-View-Controller design pattern, a controller object (or, simply, a controller) interprets user actions and intentions made in view objects-such as when the user taps or clicks a button or enters text in a text field-and communicates new or changed data to the model objects.
控制器物件扮演一个或多个的view物件和一个或多个的model物件的的协调者或是媒介。在Model-View-Controller设计模式中,一个控制器元件翻译了使用者对view物件的动作和意图,例如使用者触碰或按下按钮,或是在文字栏位中输入文字,会传送新的或更动的资料到model物件。

在这篇文件中,虽然区分出了三种控制者物件,但特别有指出在iPhone OS中,View Controllers(视图控制器)就是扮演Coordinating Controllers(协调控制器)的角色,协调控制器的功能如下:

  • Responding to delegation messages and observing notifications
    负责委托讯息和观察通知
  • Responding to action messages (which are are sent by controls such as buttons when users tap or click them)
    负责动作讯息
  • Establishing connections between objects and performing other setup tasks, such as when the application launches
    建立物件间的连结,和执行其他设定的工作,例如程式开发执行的工作
  • Managing the life cycle of “owned” objects
    管理拥有物件的生命周期

而视图控制器的其他说明如下(这段有点长@@"我去掉了一些):

A view controller manages a full-screen view, which it keeps a reference to and may create or load from a nib file. The controller manages the presentation of this view and the next view ...The navigation bar and the tab bar, and all their associated presentation behavior, are managed and implemented by view controller objects. View controllers can also display modal views, respond to low-memory warnings, and rotate views when the orientation changes.
一个视图控制器管理并维系了一个参考到由nib档案所建立或载入的一个全萤幕的视图。控制器管理这个视图呈现方式,以及下一个在使用者介面中要呈现的首要视图。导览列和分页列,以及所有相关的呈现行为,都被视图控制物件管理和实现。视图控制器也可以显示独占的视图、回应低内存警告,以及当方向改变时旋转视图。

A view controller is an instance of a subclass of UIViewController. The UIKit provides several special-purpose subclasses of UIViewController, such as UITableViewController.... View controllers are typically the delegate or data source objects for many types of framework objects.
视图控制器是一个UIViewController子类别的实体。 UIKit提供了一些针对特别需求的UIViewController子类别,像是UITableViewController。视图控制器基本上是针对于许多框架物件的委托或资料源物件。

透过理解控制器的功能之后,先看一下最常接触到的UIViewController中的可用方法有那些:
  • 「initWithNibName: bundle:」载入nib档案来初始化
  • 「loadView」载入视图
  • 「viewDidLoad」在载入视图至内存后会呼叫的方法
  • 「viewDidUnload」在视图从内存中释放后会呼叫的方法
  • 「viewWillAppear」当收到视图在视窗将可见时的通知会呼叫的方法
  • 「viewWillDisappear」當收到視圖在視窗將不可見時的通知會呼叫的方法
  • 「viewDidAppear」当收到视图在视窗将不可见时的通知会呼叫的方法
  • 「viewDidDisappear」当收到视图已去除、被覆盖或隐藏于视窗时的通知会呼叫的方法
  • 「didReceiveMemoryWarning」收到系统传来的内存警告通知后会执行的方法
  • 「shouldAutorotateToInterfaceOrientation」是否支持不同方向的旋转视图
  • 「willAnimateRotationToInterfaceOrientation」在进行旋转视图前的会执行的方法(用于调整旋转视图之用)

这些只有列出常见的,详细的方法可以在这个文件中找到。看到了吗?这些收到讯息后或前执行的方法,都和视图有关,可以说视图控制器主要是用来管理和控制视图的。执行熟悉了UIViewController之后,剩下的像继承自这个类别的子类别有三大个:有UITableViewController、UITabBarController、UINavigationController如果能熟悉各自的应用方法,大致上Controller部份就没问题了。

最后要谈到最前面的问题:那Delegate和Controller又有什么关系?有何不同,我在stackoverflow找到觉得比较好的说明:
A delegate is a protocol (interface) that defines methods that an object implements in order to receive specific messages from other objects. Delegates objects are most often used to receive asynchronous callbacks such as user input, I/O.
委托是一个协议(介面),定义了许多物件可以实作的方法,为了接收来自其他物件的特定讯息。委托物件经常使用于接收非同步的回应呼叫,例如使用者输入或I/O。

A controller is an object that usually contains UI elements (views, controls, etc.) and data, and both receives and send messages to the various objects within it. In many cases, a controller is a delegate and can implement several delegate protocols to receive events from multiple objects.
控制器是一个物件,通常其中包含UI元素(视图、控制器…等)和资料,以及接收和传送两种讯息到其中的众多物件。在大部份时候,控制器是一个委托且可以实作各种委托协议,以便可以接收来自多个物件的事件。

了解吗?还是有点模糊?我的理解是Controller是在于MVC设计模式中的C这个角色,扮演Model和View的居中协调者的工作。当然ViewController的工作就是针对视图的控制器工作,管理视图,例如在需要的时候载入它到内存中,不需要时在内存中释放它。要记得在iPhone OS中,通常一个视图只会有一个视图控制器。


而Delegate/data source是另一种实作事件控制的模式,也是位于MVC中C这个位置的机制,只是因为它是利用协定而非一般的子类别继承实体而来,变成另一类处理控制的机制。但是,这两种并不会是冲突或只能择一使用,在很多情况下,反而是两种都要搭配使用才能完成所需的工作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值