3.1 构建MonoTouch MVC应用程序
使用UIKit的MonoTouch应用程序通常都使用UIView和UIViewController来构建。这些都是用于构建模型-视图-控制器(Model-View-Controller,MVC)设计模式的iOS应用程序的主要类。
将应用程序的特定领域(Domain Specific)信息和应用程序的显示分离开来,通常会给应用程序带来好处。这种设计模式可以帮助开发人员在面对不断变化的功能需求时保持基础代码的稳定,有助于促进代码重用,并使构建单元测试的代码质量更好。MVC模式就是这样一种模式,是许多应用程序开发方案的常用模式。尤其是,CocoaTouch和MonoTouch都要用到大部分API中的MVC设计模式,所以花点时间来学习(复习)MVC及如何在MonoTouch中使用它是值得的。
MVC模式源自20世纪70年代末Trygve Reenskaug在施乐帕罗奥多研究中心(Xerox PARC)所做的工作,它将模型捕获的特定领域信息与给用户显示的信息分离开来。用户通常是指使用应用程序的人,但也可以是其他东西,如与脚本交互的另一个应用程序。在后一种情况中,脚本就是视图,它负责显示模型。对于iOS应用程序,视图就是用于人机交互的用户界面。如图3-1所示,MVC设计模式的关键是在视图与模型之间互相保持抽象。这种抽象通过“控制器”作为中介。控制器为模型和视图提供了一个中间层以使它们能够相互独立。
在第2章的示例中,并没有明确地创建控制器,只是简单地把AppDelegate作为控制器,这对于简单的演示没有问题,但通常将视图的控制器作为独立的类,专门作为视图的控制器。另外,不要让视图控制器做太多的工作(如支持多种不同类型的顶层视图),这样的超级控制器会导致在应用程序中出现紧耦合,使应用程序难于维护。
在UIKit中,屏幕上的一切都是视图。控制器有单个顶层视图,在视图里面可以添加按钮、标签、滑块等的子视图。视图负责显示和事件捕获,如前面的UIButton的TouchUpInside事件。但是,视图不会做任何事件处理,事件处理是由控制器负责的。
视图也没有其显示数据。例如,可以直接在代码中使用UITextField的文本。但是,这不是正确的MVC做法。视图只负责显示数据。如果将视图与数据耦合,那会让代码难于维护。例如,如果增加需求,要在另一个视图的标题(title)属性中显示相同的文本又会怎么样呢?如果视图拥有数据,就必须耦合该标题的视图与标签。接着又有了另一个需求,要删除第一个视图。这样做,标题的显示就会出现问题。即使这么一点不起眼的地方,也会因为一时顺手而出现问题。好的设计就是将字符串分离出来,或者作为独立的字符串,或者作为一个大类的属性,或者作为模型,让控制器作为模型和视图之间传输数据的中介。
将视图通过控制器从模型中分离出来,使代码更易于调试和重用。使用MonoTouch,可重用这点不容小觑。如果目标是多平台,就要保证模型和支持类与使用平台无关。第9章会更深入地探讨设计模式中代码重用问题。
由于视图和控制器是唯一的平台问题(在目前iOS这种情况下),所以要了解它们是如何工作的,以及如何使用工具在IB中或直接在代码中创建视图和控制器。