|
在这篇文章中,我们将要创建另外一个简单的应用程序,不过这次要学习下如何使用Views(视图)和View Controllers(视图控制器)来创建一个具有多个界面的应用程序。特别地,我们将使用UINavigationController来在应用程序里的两个界面间进行导航。
在开始构建应用程序之前,让我们简单熟悉下iPhone应用程序所用的这个重要设计模式。
模型-视图-控制器(MVC)模式
Cocoa Touch使用了一种修改版本的MVC模式来处理GUI的显示。MVC模式(自1979年以来)已经出现很长时间了,它皆在分离显示用户界面所需的大量任务,并处理用户交互。
正如名称所蕴含的,MVC具有三个主要部分,Model(模型)、View(视图)和Controller(控制器):
- 模型——模型是特定于领域的数据表现形式。比如说,我们正在创建一个任务列表应用程序。你可能会有一个Task对象的集合,书写为List<Task>。你或许把这些数据保存在数据库、XML文件,或者甚至从Web Service中得到,不过MVC不那么关心它们是在何处/如何来持久保存的(乃至它们是什么)。相反,它特别专注于如何显示这些数据,并处理与用户交互的。
- 视图——视图代表了数据如何实际地显示出来。在我们这个假设的任务应用程序中,会在一个网页(以HTML的方式)中来显示这些任务,也会在一个WPF页面中(以XAML的方式)来显示,或者在一个iPhone应用程序中显示为UITableView 。如果用户点击某个任务,要删除之,那么视图通常会触发一个事件,或对Controller(控制器)进行一个回调。
- 控制器——控制器是模型和视图间的粘合剂。控制器的目的就是获取模型中的数据,告知视图来显示。控制器还侦听着视图的事件,在用户选中一个任务来删除的时候,控制着任务从模型中删除。
通过分离显示数据、持久化数据和处理用户交互的职责,MVC模式有助于创建易于理解的代码。而且,它促进了视图和模型的解耦,以便模型能被重用。例如,在你的应用程序中,有两个界面,基于Web的和WPF的,那么你可以在两者中都使用同样的模型定义代码。
因而,在很多MVC框架中不管具体的工作方式如何,基本原理都大致如此的。然而,在Cocoa(及Cocoa Touch)中,还是或多或少有所不同,苹果用MVC来代表Views(视图)、View Controller(视图控制器)和Models(模型);但是在不同的控件中,它们却不是完全一致的,实现的方式也不太一样。我们将在构建示例应用程序的时候了解更多细节。
在MonoTouch中的视图和视图控制器
我之前简短地提到,在iPhone应用程序中,你只能显示一个窗口。不过可以包含很多界面。要做到这点,你需要为每个界面都添加一个视图和视图控制器。
视图实际上包含了所有可视化元素,比如标签、按钮等等,而视图控制器处理在视图上的实际用户交互(通过事件),并让你在这些事件被触发的时候运行相应的代码。做一个粗略的比喻的话,这就是和ASP.NET或WPF有点类似的模型,在这些模型中,你通过HTML或XAML来定义用户界面,在后置代码中处理事件。
在你导向另外一个页面的时候,就把视图控制器放到视图控制器堆栈中。在这个要构建的应用程序中,我们将使用Navigation View Controller(导航视图控制器,UINavigationController)来处理不同的界面,因为它提供了一种方式可以在界面之间非常容易地导航,通过这种基于层级模式的导航栏,让你的用户能够藉由视图控制器往后和往前进行导航。
UINavigationController 在很多内置的iPhone应用程序都能看到。例如,在查看短信列表的时候,如果你点击其中一个,顶部导航栏将在顶部显示一个左箭头按钮,让你可以回到显示消息列表的视图。
具有多个界面的Hello World应用
现在,在概念上了解了MVC的工作原理后,让我们实际地创建一个应用程序来实践下。
首先,在MonoDevelop中新建一个MonoTouch iPhone解决方案,命名为Example_HelloWorld_2(如果你忘记如何操作可以参考一下第一篇文章)。
接着,添加两个视图控制器(以及相关的视图)来服务于我们将要执行导航的应用程序中的界面。要完成这个步骤,在项目上点击右键,选择“Add : New File”。
在Interface Builder中打开.xib文件,添加一个标签到HelloWorldScreen上,修改文本为“Hello World”,另外添加一个文本到HelloUniverseScreen上,修改文本为“Hello Universe”,如下图所示:
现在,让我们添加一个Navigation Controller到Main Window上。方式是,在Interface Builder里打开MainWindow.xib,从Library Window中拖一个Navigation Controller到Document Window上:
Navigation Controller具有如下几个部分:
- Navigation Controller(导航控制器)——这是控制器的主要部分,处理导航事件,把所有东西糅合在一起。
- Navigation Bar(导航栏)——这是显示在顶部的工具条,让用户能够看到它处于导航层级的什么位置,并可以导航回去。
- 视图控制器——这个部分用来控制着视图的显示。
- Navigation Item(导航条目)—— 就是显示在导航栏上的部分,实际上就是用于导航的按钮,也显示相应的标题
接下来,我们添加一个Table View到Navigation Controller上,以便能创建一个用于各个界面的链接列表。要完成这个步骤,从Library中拖一个UITableView到Navigation Controller里的View Controller上:
改变一下导航栏的标题。在Navigation Controller上双击顶部栏,键入“Hello World Home!”:
我必须使用Table View来包含Navigation Items吗?
不用,你可以放任何东西到View Controller中。我们将在后面看到,在你导航到一个新界面的时候,你是调用NavigationController.PushViewController方法,并把要去的界面的View Controller传递给它。在用户点击按钮的时候,我们能轻易地实现它。
现在,我们获得了所需的Navigation Controller以及相关的Table View,还需要让两者都可被后置代码访问。需要让Navigation Controller在代码中可访问,以便我们能把View Controllers传给它;也需要让Table View在代码中可访问,以便我们能用要导航到的界面的名称来填充它。
要实现这个步骤,要为它们创建Outlets,正如我们在第一篇文章所做的那样的。我们把Navigation Controller取名为mainNavigationController,把Table View取名为mainNavTableView。要确保在AppDelegate中创建它们。在你完成后,Connection Inspector应该看上去如下所示:
接着,需要设置在应用程序启动的时候显示Navigation Controller。还记得之前在Main.cs中注释掉的 Window.AddSubview代码吗?对,这就是我们现在要使用的代码。我们把那行代码改为如下:
If you have defined a view, add it here:
window.AddSubview(this.mainNavigationController.View);
NET技术:MonoTouch中的MVC简介,转载需保留来源!
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。