创作结构化需求分析方法,应用结构化需求分析方法,模块设计,结构设计的区别

您所在的位置: &
功能模块需求分析
功能模块需求分析
清华大学出版社
《Java Web开发指南》第27章餐费管理系统,本章将以一个综合应用实例进一步学习在Eclipse中进行应用开发的过程。这个实例将用到一些目前比较流行的开源框架,如Struts、Spring和Hibernate,Eclipse对这些框架都有很好的支持。本节为大家介绍功能模块需求分析。
27.1.2& 功能模块需求分析
需求概述主要对用户的具体业务进行了介绍,根据这些需求可以获知系统中所要用到的功能模块,如图27.1所示。
用户注册模块:用户在系统注册,获得就餐卡号(登录号)。注册时需要先输入员工的姓名和身份证号码,系统从公司员工数据库(假设已经存在)中查询公司是否存在该员工,如果存在允许进行注册,否则不允许注册。注册时一个员工只允许注册一个账号。
用户在线刷卡模块:用户在就餐时刷卡(将自己的就餐卡号输入到餐费管理系统中),系统判断员工的账户余额,从账户余额中减去本次就餐的费用,并显示本次就餐发生费用和用户的账户余额。
用户账户查询模块:查询员工就餐费用的历史记录以及余额的情况。
用户账户充值模块:管理员收到员工的餐费后对用户的账户余额进行充值,即把收到的餐费和员工账户的余额进行累加。
用户账户管理模块:可以对员工账户进行删除和修改。
(点击查看大图)图27.1& 系统功能模块图
【责任编辑: TEL:(010)】&&&&&&
关于&&的更多文章
《分布式服务框架原理与实践》作者具有丰富的分布式服务框架、平
本书描述了黑客用默默无闻的行动为数字世界照亮了一条道路的故事。
讲师: 10人学习过讲师: 8人学习过讲师: 14人学习过
PowerShell是微软的新命令行Shell和脚本语言,承诺会
Python 是一门常用的编程语言,它不仅上手容易,而且
《Photoshop CC图像处理》全面介绍了图形图像处理软件
本书共分两篇,15章。其中前6章为网络理论基础篇,介绍的是基本的网络技术,包括计算机网络分类、网络通信协议、IP地址和网线制
51CTO旗下网站注重需求分析做好数据库应用系统的设计
注重需求分析做好数据库应用系统的设计
(广西广播电视大学理工学院  广西南宁  530022)
  [摘要]在数据库应用系统的设计中,需求分析是整个设计的基础。本文针对大专院校学生在进行数据库应用系统的设计中出现的问题,强调需求分析的重要性,并理论联系实际地对需求分析的各项工作做了具体的阐述,对学生今后的设计有一定的指导意义。
  [关键词]需求分析;数据库;数据流图;毕业设计
[中图分类号]G434[文献标识码]A[文章编号]1008--0026-03
数据库应用系统是在计算机软硬件系统和某一种数据库管理系统的支持下,针对某一方面应用的信息管理系统。在现实生活中,大到在互联网或专用网支持下的全球或全国系统,小到某个单位、某个部门,甚至某项工作的计算机管理,数据库应用系统无处不在。
  在大专院校的计算机教学中,毕业设计是完成教学计划达到专业培养目标的一个重要的教学环节,也是教学计划中综合性最强的实践性教学环节,而数据库应用系统的设计往往被作为毕业设计的选题之一。许多同学直观地认为数据库应用系统的设计就是编制程序,他们过早地将注意力放在系统的编程设计上,不注重对系统进行需求分析,导致在后期的系统测试工作中发现这样或那样的错误,造成大量的返工。
  其实,要编制出真正适用的程序,在编程之前,还需要做许多艰苦细微的工作,需求分析就是为今后工作的顺利开展创造条件的。实践证明,在一个数据库应用系统的开发过程中,要非常重视早期的分析工作,决不能草率行事,否则一旦出现错误,将造成人力物力的极大浪费。
  一个数据库应用系统的开发过程大致包括六个阶段:需求分析阶段、概念设计阶段、逻辑设计阶段、物理设计阶段、机器实现阶段、运行维护阶段。
  需求分析是整个开发过程的第一个阶段,也是最重要的一步。其主要任务是:了解和掌握数据库应用系统开发对象(用户)的工作业务流程和每个岗位、每个环节的职责,了解和掌握信息从开始产生或建立,到最后输出、存档或消亡所经过的传递和转换过程,了解和掌握各种人员在整个系统活动过程中的作用;通过同用户充分地交流和沟通,决定哪些工作应由计算机来做,哪些工作仍由手工来做,决定各种人员对信息和处理各有什么要求,对视屏操作界面和报表输出格式各有什么要求,对数据(信息)的安全性(保密性)和完整性各有什么要求,等等。它是开发人员弄清实际情况,制定合理方案,开发系统的基础,对此,必须加以高度的重视。
  下面,就需求分析阶段的具体工作进行如下归纳的描述:
  1调查、分析系统功能需求和用户活动,确定系统边界
  系统功能需求调查分析的目的是确定系统应具有哪些功能,完成哪些任务。调查分析工作通常是从用户对数据处理要求的提出开始的,通过设计人员和用户充分地讨论和协商,提出实施方案和需求,最后把系统功能确定下来。
  调查和分析用户活动是为了了解用户的各种业务活动,具体工作包括:调查各部门输入和输出的数据与格式,所需的表格和卡片,数据的加工,输入输出的部门等。调查时应特别注意了解这些报表之间的关系,各数据项的含义等,以确保建立的数据库应用系统能符合客观管理规律,满足用户的需求。
调查分析的结果要用系统功能结构图、业务流图等一系列图表表示出来。以图书管理系统为例,根据用户的处理要求划分功能模块,可以设计出功能模块调用图如图1所示
  2收集、分析、整理数据
  数据是处理的对象,是建立数据库的基础。因此收集和分析数据是需求分析阶段最重要的内容,同时也是最难完成的任务。在设计工作中遇到的最大的困难往往是由于设计人员对业务的不熟悉而无法深入全面地了解系统的数据情况,以及这些数据如何在数据库中表示,在处理模块中如何处理它们。
  2.1收集资料
  收集资料的工作是数据库设计人员和用户共同完成的任务。因为熟悉应用业务的用户最了解系统的需求,尽管他们不一定知道如何设计或实现系统,但他们对系统应当提供的处理功能最有发言权。强调各级用户的参与是数据库应用系统设计的特点之一。
  首先确定企业组织的目标,从这些目标导出对数据库的总体要求。这些要求一般应该从组织中的高层决策机构获得,因为他们熟悉企业的发展规划。通过对中层管理人员的调查访问可以获得日常控制管理的信息需求、各个部门之间的信息交流接口。通过对基层业务人员的访谈可以了解具体的业务操作流程,从而便于确定新系统的人机界限。确定哪些功能由计算机完成,哪些事情留给手工去做。具体调研的形式很多,例如通过发放信息需求调查表、当面交谈、开讨论会等多种形式。广泛收集各个部门的需求和约束条件等,在调研过程中要做详细记录,回来及时进行分析整理。
  用户需求主要包括以下三方面:
  (1)信息需求,即用户要从数据库获得的信息内容。信息需求定义了新系统应该提供的所有信息,应描述清楚系统中数据的性质及其联系。
  (2)处理需求,即完成什么处理功能及处理的方式。处理需求定义了新系统数据处理的操作,应描述操作执行的场合、频率、操作对数据的影响等等。
  (3)安全性和完整性要求。在定义信息需求和处理需求的同时必须相应确定安全性、完整性约束。
  尽管收集资料阶段的工作非常繁琐,但必须耐心细致地了解现行业务处理流程、对新系统的要求、收集全部数据资料,如报表、合同、档案、单据、计划等等。
  2.2分析整理资料
  分析的过程是对所收集到的数据进行抽象的过程。抽象是对实际事物或事件的人为处理,抽取共同的本质特性,忽略细微末节,并用各种概念精确地加以描述,这些概念组成某种模型。
  数据分析与抽象是数据库设计的基础,数据分析和抽象可以同时进行,并往往从局部入手。例如,在图书库存清单中图书的总价可通过下式求得:总价=单价*数量。此时就要考虑不必将总价作为图书表中的存储数据项,以免造成数据的冗余和产生数据的不一致性。
  2.3绘制数据流图(DFD)
  数据的收集和分析,最终应以数据流程图的形式表示出来。数据流图用来描述系统的数据流向和数据的处理功能,它以图形的方式来表达数据处理系统中信息的变换和传递过程。数据流图有三个重要特点:一是可以表示任何一个系统中信息流程;二是每个处理符号根据需要可进一步分解,以求得对问题的全面理解;三是强调的是数据流程而不是控制流程。
  数据流图的基本符号有以下几种:1)数据流,用标有名字的箭头表示有名字有流向的数据;2)数据处理,用标有名字的圆圈表示对数据进行加工和变换。指向处理的数据流是该处理的输入数据,离开处理的数据流是该处理的输出数据;3)数据文件,用标有名字的双直线段表示数据暂存的处所。对数据文件进行必要的存取,可用指向或离开文件的箭头表示;4)数据源及数据终点,用命名的方框表示数据处理过程的数据来源或数据去向。
在数据流程图中,应把数据来源、进行的处理以及处理的去向等表示清楚。对稍为复杂的系统,只用一个数据流图是不够的,应按自顶向下的分解方法逐层分解为多个数据流图。图2、图3给出了图书管理系统的顶层和0层数据流图。
  2.4数据字典(DD)
  数据字典是对各类数据描述的集合,它对数据流图中出现的所有数据元素给出逻辑定义。它在需求分析阶段建立,在整个数据库设计的各个阶段将不断修改、充实和完善。数据字典包括的主要条目有:
  1)数据项条目:包括数据项的名称、类型、字节长度、取值范围、别名等。
  2)数据流条目:包括数据流的名称,组成该数据流的所有数据项名,数据流的来源、去向及流量等。
  3)事务条目:包括事务名称、事务逻辑功能、事务处理逻辑、事务处理所涉及的部门名、数据项名、数据流名、事务处理频率、激发条件等。
  4)数据文件条目:包括数据文件名称、组成该数据文件的所有数据项名、数据存取频度、存取方式等。
  5)报表条目:包括报表名、报表所涉及的处理名、所需的数据项名、报表产生频率等。
  2.5用户确认
  设计者将需求分析产生的数据流图、数据字典、功能结构图等返回给用户,并与用户一起检查、补充、修改,最终获得用户的认可。
  3编写需求分析报告
  需求分析阶段的最后结果是编写需求分析报告。
  需求分析报告也称作系统需求说明书,它是系统的总体设计方案,内容包括:
  ①系统的概况、系统的目标、范围、背景、历史和现状。
  ②系统的原理和技术,系统适宜采用的计算机系统和数据库管理系统及相应配置情况。
  ③系统预算的开发费用和时间、工作量等。
  ④系统边界,即哪些数据和处理由计算机完成,哪些数据和处理仍由手工完成。
  ⑤系统开发人员的组成。
  ⑥用户使用系统的要求。
  随系统分析报告应提供的附件有:组织结构图、功能模块图、业务流图、数据流图和数据字典等。
  需求说明书是开发单位与用户单位共同协商达成的文档,一般要经过有关方面的专家进行评审和通过。它是以后各阶段进行开发和设计的主要依据,是以后所有工作的基础和凭证,也是最终进行系统鉴定和评价的依据。
  需求分析是数据库应用系统开发工作中一项重要的、繁杂的、工作量大的工作,它是数据库设计的基础,而数据库建造得是否合理,直接影响到系统的优劣,所以,要合理地设计好数据库,需求分析是关键,必须引起高度重视。只有需求分析工作做好了,才有可能设计出满足用户应用需求的数据库应用系统。在教学实践中,由于我们注重了这方面的工作,取得了良好的教学效果。
  [参考文献]
  [1]赵杰,杨丽丽,陈雷.数据库原理与应用[M].人民邮电出版社,2002.
  [2]施伯乐等.数据库技术[M].科学出版社,2002.
  [3]张健沛.数据库原理及应用系统开发[M].中国水利水电出版社,1999.
  [作者简介]叶嘉(1965-),女,讲师,研究方向:数据库,管理信息系统,操作系统。
  [责任编辑  张宜]当前访客身份:游客 [
当前位置:
写一个iPhone应用程序,要求可以输入名字,点击按钮后,会显示一段文字向输入的名字打招呼,例如输入“宝玉”,显示“你好,宝玉!”
这是一个很简单的应用程序,包含一个文本输入框,一个文本显示框,一个按钮。输入名字到文本输入框,再点击按钮,这时文本显示框的文字就会变成“你好,&名字&!”。但是要注意,如果用户输入为空,要有警告提示用户重新输入;如果用户输入文字太长,超过16个字符,要自动截断。
根据项目需求,画出相应的产品原型图:
初始时,文本输入框为空,但是显示水印,提醒用户可以输入姓名。文本显示框文字为空。
输入名字并点击按钮后
输入名字,并点击按钮后,屏幕中间显示文字:“您好,&名字&!”。
没有输入名字的警告提示
如果没有输入名字,点击按钮后弹出警告窗口,提醒用户输入名字。
这是一个非常简单的应用程序,实现思路不不算复杂:
一个文本输入框,用来输入文字,需要限制最大字符长度为16个字符,输入框没有内容时,显示水印文字。UITextField控件正好可以满足需求。
一个文本显示框,用来显示最终生成的文字。使用UILabel控件即可满足需求。
一个按钮,点击后,获取文本输入框文字内容,生成“你好,&名字&!”文字,并显示在文本显示框中。如果点击时文本输入框文字为空,弹出警告提示框。
同时,这个应用程序在开发过程中,需要应用到iPhone开发中一些常用的设计模式:
委托(Delegate)
模型 视图 控制器(MVC)
目标 - 动作(Target-Action)
委托(Delegate)
委托模式是一个对象周期性地向被指定为其委托的另一个对象发送消息,向其请求输入或者通知某件事情正在发生。该模式可替换类继承来对可复用对象的功能进行扩展。
在本项目中,应用程序对象会向其委托发送消息,通知它主要的启动例程已经完成并且定制的配置可开始执行。为了建立并管理视图,委托会创建一个控制器实例。另外,当用户点击Return按键后,文本字段也会通知它的委托(即所创建的控制器对象)
委托方法通常会集中在一起形成一份协议。 一份协议基本上就是一个方法的列表。如果一个类遵循某个协议,则它要保证实现协议所要求的方法(有些方法可选择实现与否)。委托协议规定了一个对象可以发送给委托的所有消息。例如常见的有:UITextFieldDelegate, UIApplicationDelegate, UIScrollViewDelegate, UITableViewDelegate, UIWebViewDelegate。
模型 视图 控制器(MVC)
MVC模式将应用程序中的对象设定为三种角色:模型角色(Model)、视图角色(View)和控制器角色(Controller)。
模型对象(Model)表示数据。例如,在iPhone自带的通讯录应用中,联系人是模型对象,在一个绘画应用中,圆形、矩形是模型对象。
本项目的应用程序用到的数据非常简单——字符串,并且该字符串只有在按钮点击的方法中用到。其实换一种角度来说,字符串也是一种最简单的模型对象,在其他的应用程序中,模型对象将会更加复杂,并且模型对象在程序中无处不在,可以在多个地方进行访问。
视图对象(View)负责显示数据,比如UILabel可以显示文本、UIImageView可以显示图片,也会支持用户对数据的编辑操作,例如UITextField可以支持用户输入。
在我们接下来要创建的项目中,需要一个主视图来包含其它几个视图——首先是一个文本输入框,它用于捕获用户输入信息;然后是一个文本显示框,它用于显示文本,而文本内容则是基于用户的输入;另外还需要一个按键,让用户可以点击它,点击后通知文本字段更新。
控制器对象(Controller)介于模型和视图之间。
在我们接下来要创建的项目中,当用户点击按钮后,触发更新操作,控制器对象将会从文本输入框中获取输入的文字内容,并把文字存放在一个字符串中,然后再把文本显示框的内容更新成格式化好的内容。
结合MVC模式,对于本项目的主要流程,整个如图所示:
目标 - 动作(Target - Action)
目标-动作机制,允许一个控件对象(例如按键或滑动条) 向另外一个对象发送一条消息(即动作),以之作为对某个用户事件(例如一个点击事件)的响应。接收到消息的对象则可以对消息进行响应,并针对业务要求做出处理。
在本项目中,当点击按钮时,它会通知控制器去获取文本输入框内容,并根据输入内容更新文本显示框。
我们将开始使用Xcode来创建项目,启动Xcode(缺省情况下,Xcode位于 /Developer/Applications 里面),然后选择File & New & New Project,这样就可以创建一个新的工程。应该可以看到一个新的窗口,如下图所示:
选中 Window-Based Application 并点击 Next 按钮,输入Product Name(项目名):SayHello,在Company Identifier那,可以输入公司名唯一标识。
点击Next,选择项目存储位置,最后点击Create按钮。
完成上述步骤后,将看到如下的新项目窗口:
在进行下一步工作之前,可以先编译运行一下程序,这样就可以通过模拟器看到程序运行后的样子。在Xcode的菜单中选择 Product & Run 或者点击左上角工具栏上的 Run 按钮,iPhone模拟器应该会自动启动。当应用程序启动后,可以看到一个白色屏幕。
应用程序启动过程解析
通过Xcode的模板创建项目时,模板已经帮助设置好了应用程序基本程序环境,它会帮助创建一个应用程序对象,将应用程序和窗口连接起来,建立一个运行环境。整个启动过程从UIApplicationMain函数开始,如下图所示:
main.m文件中的main函数会调用UIApplicationMain函数:
int retVal =
UIApplicationMain(argc, argv,
该函数将会创建一个UIApplicaion类的实例。同时它会搜索应用程序的Info.plist属性列表文件。 Info.plist文件是一部字典,它主要包含诸如应用程序名称、图标这样的信息,它也包含应用程序对象应该加载的nib 文件(虽然该文件的扩展名为“xib”,但是我们习惯称之为“nib 文件”)的名称。Nib文件主要有用户界面的信息。本项目的Info.plist文件具有下面的内容:
术语: 虽然Interface Builder文档的扩展名可能是“.xib” ,但历史上,其扩展名是“.nib”(“NextStep Interface Builder”的首字母缩写),因此人们就俗称其为“Nib文件”。
这表明应用程序启动时将会加载MainWindow nib文件。在Xcode中可以单击MainWindow.xib进行查看(注意在Xcode4中已经不需要通过Interface Builder来打开nib文件,可以直接在Xcode对nib文件进行查看和编辑):
MainWindow Nib文档包含4个对象:
File's Owner,文件拥有者代理对象,在这里MainWindow的拥有者对象时UIApplication实例
First Responder,第一响应者代理对象,在本项目中,没有使用到
Say Hello App Delegate,SayHelloAppDelegate的实例,也就是应用程序的委托
Window,一个窗口对象。它默认是白色背景,程序启动时看到的就是它
应用程序对象在完成启动后,会向委托发送applicationDidFinishLaunching:消息,通知程序已经启动成功了,这样我们可以在收到这个消息后根据需要进行一些操作。下图是一个简化的iPhone应用程序生命周期图,简要展示了发生在应用程序启动到退出的过程。
这样,我们基本了解了如何创建一个项目,以及一个应用程序的启动过程,接下来,我们需要创建一个视图控制器(UIViewController)实例,用来实现项目功能。
添加视图控制器(UIViewController)
添加视图控制器文件
在iPhone应用程序中,视图控制器(UIViewController)起着核心作用。顾名思义,视图控制器负责管理控制视图。在iPhone上,它们也帮助进行导航和内存管理。
选中Xcode项目管理器里的项目(即SayHello项目,位于Groups and Files列表的顶部)或者选中SayHello文件夹——新文件在添加时会被加入到当前选择的位置。 选中后,在Xcode菜单中选择 File & New & New File,也可以在选中的文件夹上面点右键,选择 New File。
在New File窗口中,请选择Cocoa Touch,然后选择UIViewController subclass。
点击 Next 按钮,在Options窗口,请勾选 “With XIB for user interface”复选框。选中 “With XIB for user interface”后,Xcode在创建视图控制器的同时,会为其创建一份nib文件,并将该文件添加到项目中。
点击Next按钮,在其后出现的保存文件窗口中,为文件起个名字,例如RootTimelineViewController,并选择文件存储的位置,如下所示:
点击 Save,文件会被添加到项目中。接下来,我们将创建控制器类的实例。
创建视图控制器实例
现在,我们有了视图控制器的类和nib文件,但要在应用程序代理中使用它,还必须创建类的实例,并且将实例存储在变量中,以便操作它。
在应用程序委托类的头文件(即SayHelloAppDelegate.h)中执行下述操作:
在一个类中访问另一个类,首先需要引用被访问类的头文件。所以我们先在应用程序委托头文件(SayHelloAppDelegate.h)的接口声明前面-即SayHelloAppDelegate声明前面引用视图控制器(RootViewController)的头文件:
#import &RootViewController.h&
然后在头文件大括号之间添加下面的代码,这是为了向应用程序委托添加一个实例变量:
RootViewController *viewC
在大括号之后 @end之前添加下面的属性声明:
@property (nonatomic, retain) RootViewController *viewC
在头文件中添加完相应变量和属性申明后,需要在对应的实现文件中,合成属性的存取方法,在dealloc方法中释放视图控制器的实例。
在应用程序委托类的实现文件(即SayHelloAppDelegate.m)中执行下述操作:
在类的 @implementation代码块中通知编译器为视图控制器合成存取方法:
@synthesize viewC
在dealloc方法起始处释放视图控制器:
[viewController release];
我们已经把视图控制器属性添加到应用程序的委托,现在需要实际创建一个视图控制器实例,并将其设置为属性的值。
在应用程序委托类实现文件(即SayHelloWorldAppDelegate.m文件)中的applicationDidFinishLaunching: 方法开头添加如下代码,这些代码用于创建一个RootViewController实例:
RootViewController *controller = [[RootViewController alloc]initWithNibName:@&RootViewController& bundle:nil];
self.viewController =
[controller release];
这段代码的作用如下:
创建RootViewController这个视图控制器的实例。使用alloc方法创建一个视图控制器,然后用initWithNibName:bundle:方法对其进行初始化。init方法先指定控制器应加载的nib文件,然后指定在哪个程序包中可找到该文件。程序包是文件系统某个位置的抽象,该位置存放了应用程序将会用到的代码和资源。
使用属性的存取方法,将创建好的视图控制器实例设置为viewController属性变量的值
根据内存管理规则释放视图控制器
视图控制器用来配置和管理在应用程序中看到的视图,每一个视图也对应有一个视图控制器来管理。窗体(window)有一个根视图控制器——这个视图控制器负责配置当窗体显示时最先显示的视图。要让你的视图控制器的内容显示在窗体中,需要去设置窗体的根视图控制器为你的视图控制器。
所以我们的项目中,在上面创建视图控制器实例代码后面再添加一行代码,来设置窗体的根视图控制器为我们新添加的视图控制器:
self.window.rootViewController =
最后一行来自于Xcode提供的模板自动生成的代码:
[self.window makeKeyAndVisible];
这行代码会让包含了视图控制器视图的Window窗口显示在屏幕上。
本章完整代码,SayHelloAppDelegate.h文件:
#import &UIKit/UIKit.h&
#import &RootViewController.h&
@interface SayHelloAppDelegate : NSObject &UIApplicationDelegate& {
RootViewController *viewC
@property (nonatomic, retain) IBOutlet UIWindow *
@property (nonatomic, retain) RootViewController *viewC
SayHelloAppDelegate.m文件:
#import &SayHelloAppDelegate.h&
@implementation SayHelloAppDelegate
@synthesize window=_window;
@synthesize viewC
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
RootViewController *controller = [[RootViewController alloc]initWithNibName:@&RootViewController& bundle:nil];
self.viewController =
[controller release];
self.window.rootViewController =
[self.window makeKeyAndVisible];
return YES;
- (void)dealloc
[_window release];
[viewController release];
[super dealloc];
在Xcode的菜单中选择 Product & Run 或者点击左上角工具栏上的 Run 按钮,iPhone模拟器应该会自动启动。当应用程序启动后,还是看到一个白色屏幕,不过第一次看到的白色屏幕,是应用程序代理中的Window,而这次看到的白色屏幕,是视图控制器RootViewController中的视图。
下一步,我们将开始对界面进行编辑。
编辑Nib文件
在iPhone开发中,一般都会用NIB文件来来负责界面显示,也就是MVC模型里面的视图对象,而NIB文件只包含用户界面元素,不包含任何源码,那么怎么让视图对象和视图控制器关联起来呢?这就需要用到两个非常重要的概念:插座变量(outlet)和文件拥有者代理对象(File's Owner)。
视图控制器的视图和Nib文件
视图控制器主要的职责就是配置和管理应用程序中所有的视图,一般来说,视图控制器的视图是放在一个Nib文件中,当然也可以不需要Nib文件,通过程序创建视图,典型的如UITableViewController这样的视图控制器,就可以不需要Nib文件。在创建视图控制器实例时,其中一个主要的构造函数 initWithNibName:bundle: 的第一个参数就是视图控制器对应的Nib文件的名字。视图控制器在其 loadView 方法中加载它的Nib文件。如果是使用 initWithNibName:bundle: 构造函数生成的实例,并且你想在视图加载完成后进行额外的设置,只要重写视图控制器的 viewDidLoad 方法就好了。
在Xcode中点击打开视图控制器的Nib文件(即RootViewController.xib文件),在Xcode中即可直接查看和编辑。文件包含三个对象,文件拥有者代理(File's Owner),第一响应者代理(First Responder)以及一个视图(View)。视图(View)是视图控制器的主视图,在主视图中还可以添加若干子视图。文件拥有者代理(File's Owner)代表Nib文件对应的视图控制器类。理解文件所有者代理的角色,以及如何建立文件所有者和Nib文件中界面元素之间的连接,是非常重要的。
小贴士: 在Xcode中编辑Nib文件时,可以通过点击右上角工具栏按钮
显示隐藏相应面板,方便对界面编辑和属性设置。
文件拥有者(File's Owner)
在一个Nib文件中,文件拥有者对象是其中最重要的对象之一,因为正是通过它,来建立起应用程序代码和Nib界面文件中对象之间的连接,具体来说,它就是对应Nib文件的视图控制器对象。以本项目为例,RootViewController.xib这个Nib文件的文件拥有者对象就是RootViewController类的实例。
一般来说,在使用模板同时创建UIViewController文件和对应的Nib文件时,它默认会设置Nib文件对应的文件拥有者为创建的UIViewController类。如果要修改或者设置Nib文件对应的文件拥有者,可以使用 Identity Inspector 面板进行设置。
如上图所示, 本项目的RootViewController.xib文件对应的文件所有者,在Identity Inspector 面板中,Custom Class部分的Class项,可以看到对应的值是RootViewController,这表示文件拥有者就是RootViewController类的实例,就可以在Xcode中访问文件拥有者类里面标志为IBOutlet的属性和IBAction的方法,和Nib文件中的界面元素建立关联。
视图插座变量
在Xcode中,使用 Inspector 面板,或者在连接面板,可以查看、创建、删除对象之间的连接。要查看视图控制器的连接,可以通过以下步骤:
在Xcode的界面中,从左侧的文件组选中要查看的视图控制器的Xib文件
在视图编辑界面,点击选中 File's Owner
在 Inspector 面板,选中 Connection inspector,这里会显示文件所有者所有的插座连接
在视图编辑界面,按住Control键点击 File's Owner 或者在 File's Owner上点击右键,弹出一个黑色半透明的面板显示文件所有者的所有连接
在上面第三步,右侧面板显示的连接面板和右键点击File's Owner弹出的半透明连接面板,显示的信息和作用都是一样的,可以根据个人习惯灵活使用。到目前为止唯一的连接是视图控制器的 view 插座变量。一个插座变量就对应视图控制器类的一个属性(有时候也可以是一个实例变量),只不过这个属性和nib文件中的某个界面元素连接在一起。此处的view的连接,表明当nib文件 RootViewController.xib 被加载,并且UIView的实例解档之后,视图控制器的view实例变量会被设置为指向nib文件中的视图。
在项目开发中,尤其在对开发工具和语言不熟悉的时候,需要经常性的对新增的功能进行测试,以确保当前功能运行是正常的。比如我们新增了RootViewController这个自定义视图控制器,需要去测试一下它是不是已经成功添加。要测试视图控制器工作正常,简单的办法修改视图控制器的视图的背景色,例如修改为粉红色背景,然后重新运行,看看是不是界面变成了红色背景。
要设置视图控制器的视图的背景色,步骤如下:
在Xcode的界面中,从左侧的文件组选中视图控制器的Xib文件(RootViewController.xib)
在右侧的功能区域,选择属性面板(Attributes inspector)
在编辑区域,选择视图
在视图的属性面板,点击背景色(Background)对应的颜色下拉框,会弹出颜色选择面板
在颜色选择面板,选择一个合适的颜色,例如粉红色
保存nib文件
点击左上角工具栏的Run按钮,编译运行项目
正常情况下,编译应该不会出现任何错误,运行后会弹出模拟器,结果如下图所示:
确认没有问题后,再将应用的背景色还原。还原的话,将视图的背景色设置为白色就好了。
Xcode提供了一套对象库,可以直接添加到Nib文件中。其中一部分示界面元素,例如按钮和文本输入框;其他一部分是控制器对象,例如视图控制器。我们当前项目的nib文件已经包含了视图,现在只要添加按钮和文本输入框就好了。从对象库中将用户界面元素拖动到视图中,基本步骤如下:
在Xcode的界面中,从左侧的文件组选中视图控制器的Xib文件(RootViewController.xib)
在右侧的功能区域,显示对象库(object library)
添加一个按钮(UIButton),一个文本输入框(UITextField),两个文本标签(UILabel)到视图中。可以从对象库里面拖动并将它们放到视图
参考前面的原型设计,对界面元素的尺寸和布局进行调整
将右侧功能区域切换到属性面板(Attributes inspector)
选中文本输入框(Text Field),设置Placehold属性为“请输入姓名”
选中左上侧的文本标签(UILabel),设置Text属性为“姓名”
选中下面的文本标签(UILabel),设置Text属性为空,Alignment属性设置为居中对齐
选中按钮(UIButton),设置Title属性为“招呼”
设置好的界面如下所示:
如果我们想让用户在输入时有一些更好的体验,比如用户输入英文名时,默认会首字母大写;比如键盘会显示完成(Done)按键,点击后完成输入隐藏键盘。要支持这样的输入细节,通过设置文本框属性就可以完成:
在Capitalization下拉列表,选择Words,以支持首字母大写
在Return Key下拉列表,选择Done,以支持键盘上显示完成(Done)按键
保存文件后,编译运行程序,可以看到运行的界面效果和我们在Xcode中摆放的效果是一样的。点击按钮,按钮会高亮,在文本输入框中点击,会弹出输入键盘,键盘里可以看到完成(Done)按钮。但是还不能根据输入的内容去显示文字,还不能隐藏键盘,因为目前我们还仅仅完成了视图部分的工作,还需要让视图中的对象和视图控制器的对象之间建立连接,并添加相应的逻辑,才能实现。
实现视图控制器
实现视图控制器需要完成以下几件事:
定义插座变量和动作方法,和Nib文件的视图中的界面元素进行关联
实现点击按钮后的相关逻辑——根据输入的名字显示相应的招呼语,判断输入的名字是不是为空是不是超长
用户点击键盘上的完成(Done)按键后,键盘会消失
从业务角度来看,我们需要和界面的几个元素建立关联:
文本输入框,获取它的输入文字
文本标签,让它显示特定文字
按钮,响应它的点击事件
在Xcode4之前,Interface Builder和Xcode是分开的,一般是先在Xcode中定义好插座变量和动作方法,然后再在InterfaceBuilder中去建立界面元素和视图控制器之间的连接,到Xcode4之后,Interface Builder和Xcode已经统一合并在了一起,所以这部分也有一些变化,Xcode4让这部分工作变的更加容易一些,可以直接从视图编辑界面拖动连接到代码文件。
在我们正在开发的SayHello项目中,现在我们需要添加一个动作方法到视图控制器,当界面上的按钮被点击时,它会发送一个sayHello:消息到视图控制器,所以接下来要为按钮创建一个sayHello:动作方法:
在Xcode中,选择视图控制器对应的Nib文件(RootViewController.xib)
显示Assistant editor
让Assistant显示视图控制器的头文件(RootViewController.h)
按住Control键,从Nib文件中的按钮拖动到头文件的方法声明代码区域
在弹出的面板中,将按钮和视图控制器之间的连接设置为动作(Action)
设置 Connection 为 Action
设置 Name 为 sayHello:
设置 Type 为 id
设置 Event 为 Touch Up Inside,也就是用户在点击按钮,然后释放后触发
设置 Arguments 为 Sender
点击Connect建立连接
通过上面的为按钮添加动作的操作,完成了两件事
添加了相应的代码到视图控制器的类中 头文件中增加了如下代码:
- (IBAction)sayHello:(id)
并且实现文件中增加了相应的实现方法:
- (IBAction)sayHello:(id)sender {
IBAction 是一个特殊的关键字,它唯一的作用是告诉Interface Builder将某个方法当成目标/动作关联中的动作。它被定义为void。
建立了按钮到视图控制器之间的连接。建立连接的意义,等同于在按钮上调用 addTarget:action:forControlEvents: ,并且 target 是文件拥有者(File's Owner)也就是视图控制器,action 是 sayHello: 方法,对应的事件是 UIControlEventTouchUpInside。
接下来要建立文本输入框和文本标签之间的连接:
在Xcode中,选择视图控制器对应的Nib文件(RootViewController.xib)
显示Assistant editor
让Assistant显示视图控制器的头文件(RootViewController.h)
按住Control键,从Nib文件中的文本输入框拖动到头文件的方法声明代码区域
在弹出的面板中,将文本输入框和视图控制器之间的连接设置为插座(Outlet)
设置 Connection 为 Outlet
设置 Name 为 nameTextField
设置 Type 为 UITextField
点击Connect建立连接
通过上面的为文本输入框添加插座变量的操作,完成了两件事
添加了相应的代码到视图控制器的类中 头文件中增加了如下代码:
@property (nonatomic, retain) IBOutlet UITextField *nameTextF
并且实现文件中增加了相应的实现方法: 在顶部增加了:
@synthesize nameTextF
在 dealloc 方法中添加了
[nameTextField release];
在 viewDidUnload 方法中添加了:
[self setNameTextField:nil];
IBOutlet是一个特殊的关键字,它唯一的作用是通知Interface Builder将某个实例变量或者属性当成插座变量。实际上,这个关键字被定义为空白,因此在编译的时候它没有任何作用。
建立了文本输入框到视图控制器之间的连接。建立连接的意义,等同于在视图控制器上调用 setNameTextFiled: 方法,将文本输入框作为参数传入。
按照上面创建文本输入框插座变量相同的方法,再建立用来显示问候语的文本标签的插座变量,并且将插座变量命名为 greetingLabel,类型为 UILabel。
实现逻辑代码
点击视图中的按钮,它会向视图控制器发送 sayHello: 消息,之后,视图控制器会取得文本输入框文字内容,根据内容来更新用来显示问候语的文本标签的内容。以下是RootViewController.m文件中 sayHello: 方法代码的实现:
- (IBAction)sayHello:(id)sender {
// 获取文本输入框内容,并存储到变量中
NSString *nameString = nameTextField.text;
// 检查输入的名字是否为空,如果为空,弹出提示信息
if (nameString.length == ) {
UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@&名字不能为空& message:@&请输入名字后,重新点击按钮。& delegate:nil cancelButtonTitle:@&确定& otherButtonTitles:nil, nil];
[alertView show];
[alertView release];
greetingLabel.text = @&&;
// 检查名字是不是超过16个字符,超过16个字符自动截断
if (nameString.length & 16) {
nameString = [nameString substringToIndex:16];
// 根据输入的名字,生成问候语
NSString *greeting = [NSString stringWithFormat:@&你好,%@!&, nameString];
// 显示问候语
greetingLabel.text =
对于这个方法有几点补充说明:
UIAlertView是专门用来显示消息提示对话框
stringWithFormat:方法符串按照格式化字符串所指定的格式创建一个新字符串。%@表明此处应该使用一个字符串对象来代替。
编译并运行应用程序。在文本框中输入“Jim”,点击按键后,标签显示“你好, Jim!” 。但是选择文本字段进行输入,您会发现您没有办法表示已完成输入,也没有办法消除键盘。在iPhone应用程序中,当一个允许文本输入的元素变成第一响应者时,键盘就会自动显示出来,而当该元素不再处于第一响应者状态,键盘就会消失。我们不能直接向键盘发送消息,但是可以切换文本输入元素的第一响应者状态,利用该操作的附加效果来显示或消除键盘。在应用程序中,当用户点击文本字段时,该控件就会变成第一响应者,因此键盘就会显示出来。而当用户点击键盘中的Done按键时,希望键盘消失。
UITextFieldDelegate协议包含一个textFieldShouldReturn:方法,一旦用户点击Return按键,文本字段就会调用该方法(和按键的标题无关)。但将视图控制器设置成文本输入框(UITextField)的委托(Delegate),才可以实现该方法,在方法中向文本字段发送resignFirstResponder消息,这个消息的附加效果会让键盘消失。
通过以下步骤设置文本输入框的委托(delegate)连接:
在Xcode中,选择视图控制器对应的Nib文件(RootViewController.xib)
按住Control键,点击文本输入框
在弹出的半透明面板中,选中 delegate 后面的圆点,并拖动到 File's Owner
接下来,来实现将RootViewController作为文本输入框nameTextField的委托(delegate)
在视图控制器的头文件(RootViewController.h)中,在UIViewController后面添加&UITextFieldDelegate&:
@interface RootViewController : UIViewController&UITextFieldDelegate& {
这个申明表示视图控制器RootViewController将支持UITextFieldDelegate协议
在视图控制器的实现文件(RootViewController.m),实现 textFieldShouldReturn: 方法:
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
if (nameTextField == textField) {
[nameTextField resignFirstResponder];
return YES;
因为这个应用程序只有一个文本输入框,所以其实不需要包含nameTextField == textField检查。不过有些时候,对象可能会被设置成多个相同类型的对象的委托,这时候就需要来区分这些对象。
至此我们已经开发完成了整个应用程序。接下来将对它进行测试。
这个应用程序相对简单,我们设计几个测试场景:
输入正常的名字,例如“宝玉”,然后点击按钮,看看是不是会显示“你好,宝玉!”
不输入任何名字,点击按钮,看看是不是会有提示信息,要求输入名字。
分别输入16个、17个、20个字符的名字,看看名字是不是最多只能显示前16个字符
点击文本输入框,显示键盘,点击键盘上的Done按钮,看键盘是不是会隐藏
针对这个测试场景,逐一做一下功能的测试,看起来结果和我们预期的完全一样。
小结 通过这样一个简单的项目,了解以下知识点:
iOS开发常用的一些设计模式
iPhone程序的启动过程
视图控制器和Nib文件如何建立连接
这些知识对于iPhone开发和iOS开发来说,都是会经常用到的知识。
共有2个评论
<span class="a_vote_num" id="a_vote_num_
写这文档够花精力和时间的哦。
<span class="a_vote_num" id="a_vote_num_
更多开发者职位上
有什么技术问题吗?
鉴客的其它问题
类似的话题

我要回帖

更多关于 歌曲分析与创作 的文章

 

随机推荐