基于iOS的电子菜单设计与实现--毕业论文 - 图文

更新时间:2024-07-03 06:14:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

河北地质大学本科生毕业设计

摘 要

信息技术在全球的广泛使用,不仅深刻地影响着经济结构与经济效率,而且还被作为先进生产力的代表。在经济全球化的今天,信息技术已经成为一种在各个领域取胜的强大武器,例如在军事领域,教学领域,医疗领域等等,当然它也可以被用于餐饮行业。

电子菜单项目的开发使用了苹果自己研发的开发软件Xcode,主要有UIkit框架和Foundation框架组成。电子菜单的项目开发,对数据进行展示主要应用滑动视图控制器UIScrollerView和列表控制器UITableView相结合,在使用UITableView时对cell的复用是此技术的难点,主要避免在cell复用是出现内存泄露状况而导致的程序崩溃,数据的获取和保存应用了FMDB第三方库,对数据库中的数据进行增删改查等操作,此数据库的底层也是对SQLite的封装,开发者应用起来更顺手简介,提高效率,把获取的数据用数据模型接收,这样有利于降低耦合性,使程序更顺畅,代码更健壮。

系统中的基本功能都已经实现,满足用户需求。而且本系统巧妙地将信息技术结合到餐饮业中,大大的节约了餐饮业的成本,同时也兼顾了用户群体的利益,为用户带来一个简洁、易用、方便、美观的点餐平台。

关键词:iOS,SQLite,通知,应用,控件

I

河北地质大学本科生毕业设计

Abstract

The widespread use of information technology in the world, not only has a profound impact on the economic structure and economic efficiency, but also as a representative of the advanced productive forces. In today's economic globalization, information technology has become a powerful weapon to win in all fields, such as in the field of military, teaching, medical field and so on, of course, it can also be used for food and beverage industry.

The development of electronic menu items using Apple's own research and development of software development Xcode, is mainly composed of UIkit framework and Foundation framework. Project development of electronic menu, the data show the main application of sliding view controller UIScrollerView and UITableView controller combination list, when using UITableView cell to reuse is a difficulty of this technology, mainly in the cell multiplexing is to avoid memory leaks caused by the status of the program crashes, obtaining and preservation of the application of the FMDB third party library data and the data in the database CRUD operations, the underlying database is also the SQLite package, application developers more easily, improve the efficiency of the data received by the data model, it can reduce the coupling, make the program more smooth, more robust code.

The basic functions of the system have been realized, to meet the needs of users. And the system cleverly the information technology with the food and beverage industry in, greatly saves the cost of food and beverage industry, while also taking into account the interests of the user groups, bring a simple, easy to use, convenient, beautiful ordering platform for the user.

Keywords: iOS, SQLite, notification, application, control

II

河北地质大学本科生毕业设计

目 录

摘要 .................................................................................................................................................. I 第1章前言 ...................................................................................................................................... 1

1.1 课题开发背景................................................................................................................... 1 1.2 电子菜单app框架设计开发的现实意义 ....................................................................... 1 1.3 论文内容和结构............................................................................................................... 2 第2章电子菜单应用开发技术简介............................................................................................... 3

2.1 Objective-C简介 ........................................................................................................... 3

2.1.1 iOS系统 ................................................................................................................ 3 2.1.2 核心操作系统层和核心服务层 ........................................................................... 4 2.1.3 应用程序框架 ....................................................................................................... 5 2.2 SQLite数据库介绍 ......................................................................................................... 5 2.3 Xcode ................................................................................................................................ 6 第3章电子菜单app需求分析 ...................................................................................................... 8

3.1 电子菜单app的可行性分析........................................................................................... 8 3.2 电子菜单app功能需求分析........................................................................................... 9 第4章电子菜单app设计 ............................................................................................................ 12

4.1 辅助功能设计 ................................................................................................................. 12

4.1.1 数据库操作功能 ................................................................................................. 12 4.1.2 跳转动画功能 ..................................................................................................... 12 4.2 模块功能设计 ................................................................................................................. 12

4.2.1 登陆和语言选择模块 ......................................................................................... 12 4.2.2 历史菜单模块 ..................................................................................................... 13 4.2.3 历史菜单详情模块 ............................................................................................. 14 4.2.4 菜品介绍模块 ..................................................................................................... 15 4.2.5 我的菜单模块 ..................................................................................................... 16 4.2.6 送单模块 ............................................................................................................. 17 4.2.7餐位选择模块 ...................................................................................................... 18

第5章系统测试 ............................................................................................................................ 19

5.1 功能模块测试................................................................................................................. 19 5.2 功能整体测试................................................................................................................. 19 总结与展望 .................................................................................................................................... 20

总结 ........................................................................................................................................ 20 展望 ........................................................................................................................................ 20 参考文献 ........................................................................................................................................ 21 致谢 ................................................................................................................................................ 22 附录 ................................................................................................................................................ 23

III

河北地质大学本科生毕业设计

第1章 前 言

1.1 课题开发背景

伴随着餐饮行业的快速发展,菜单也发生了重大演变,从挂牌菜单、华丽纸质菜单到点菜宝的兴起,再到电子菜单的横空出世,无一不体现着餐饮业及消费者对点菜方式的重视。高效、便捷的点菜方式成为餐饮业与消费者共同的追求。现今,大中型餐饮机构已告别了纸笔记录的传统点菜方式,转而使用智能化的点菜宝。

然而,随着科技的发展,点菜宝已越来越无法满足消费者及餐饮业主的需求,安装复杂、升级困难、维护成本高、无法脱离纸质菜单成为点菜宝的诟病。平板电脑的出现掀起了菜单行业的新浪潮,基于平板电脑的电子菜单因良好的客户体验、更新及时、信息容量大等优势成为了餐饮界的新一代宠儿。

电子菜单是结合无线点菜系统和触摸屏点菜系统为一体的新型智能化菜单,通过WIFI或433协议无线传输实现可视化操作,是基于物联网和云计算技术为餐饮店量身打造的智能管理系统。基于平板电脑上的电子菜单为顾客提供绚丽图文界面及前所未有的交互性,为餐厅提供易于维护的动态菜单,随时更新,随时生效,特有的客户管理系统和存货管理系统为餐饮经营提供了极大便利。电子菜单可通过上传图片等及时快速地更新菜谱,维护费用低廉,长期成本较低。

根据西安电子菜单行业现状的调查结果,结合西安餐饮业现状,不难发现电子菜单的长期成本远低于其他形式的餐单。通过对西安50家中等规模饭店的调查,我们发现普通纸质菜单制作周期长、成本高,平均每本菜谱的成本在200~500元间,平均使用周期仅0.25~0.5年,平均每次需制作20~40本,外加手工单、菜牌及酒水单的制作等费用,平均每家酒店每年菜单的制作成本在6~10万元。按3年使用时间计算,使用高性价比的电子菜谱,暂且不考虑人工成本及时间成本,仅餐单制作成本就已下降到原来的二分之一左右。

1.2 电子菜单app框架设计开发的现实意义

新一代餐饮行业电子点餐技术,又称芯菜单。它是一套集成了基于平板电脑的电子菜单(iPad或Android平板电脑)和后台服务管理软件的餐饮行业服务管理系统。它是“传统菜谱”与“点菜宝”结合的产物,是新技术发展的必然趋势。

顶级客户体验。点菜方式新颖,操作使用简便,外观大气时尚,提升饭店档次,减少工作失误,提高顾客满意度。新品菜、特色菜、套餐推荐消费模式,引导顾客消费,把握主动权。

综合成本远低于传统菜单。传统菜单制作成本高且需要不断翻新,修改,更换。以电子菜单3年的使用周期看,综合成本远远低于传统纸介菜单。菜单实时自主更新,更换迅速简便。

信息存储量大,菜单可实时更新,且能实现售罄提示功能。电子菜单采用大容量平板电脑,能够存储大量的文字、图片、语音、视频等信息。菜品售罄及时显示,提升客户满意度 信息提交方便简单,包间、后厨、信息连接更直接。除菜单之外可以添加酒店背景,领导介绍,大厨资历简介,优秀员工表彰信息等,是酒店文化最全面的展示平台。电子菜单的实时售罄提示功能,能够避免菜品售罄造成的退单等情况,同时可以为顾客推荐类似

1

河北地质大学本科生毕业设计

口味菜品,保障酒店销售业绩。推荐菜,折扣菜,套餐系统,更多的消费模式,大大提高客人点餐效率。

节省点菜时间,提高翻台率。顾客消费方式新颖,提升消费档次,拉动消费欲望。信息一览无余,点单更简便。等菜之前还可以稍作娱乐,打发时间。

电子菜单的使用流程:当顾客进入餐厅就餐时,迎宾带客入座。服务人员即递上一本电子菜谱。使真实的菜品图片、价格及简介展示在电子菜谱的触摸式高精度液晶屏幕上,供消费者自行选择适合自己的菜品。让顾客体会到菜品的真实情况,当顾客选择完毕后,可以自行核对所点菜品及消费金额并提交菜品,让顾客感觉到明明白白的消费。顾客提交的信息会存储到本地数据库,后厨可以从数据库中获取到顾客的要求,位置及其他信息。顾客消费完毕后,再由服务人员带消费小票与顾客核对金额付款,听取顾客的反馈意见,先消费满意后付款,满足大众需求。

1.3 论文内容和结构

本论文主要写的是一个基于iOS系统的电子菜单设计与实现,以及一些在实现过程中遇到的难题,解决方法,自己在解决问题中的体悟和感受,以及对以后项目的完善的展望,本文把实现项目过程中的核心代码张是给读者看,让读者对我的项目有初步的了解,也对关键代码附有文字说明以及代码运行后的图片展示。具体章节内容如下简介讲述:

第一章,介绍了课题的开发背景、课题开发的现实意义以及论文内容及结构。

第二章,概略地介绍了开发电子菜单多用到的各种技术,比如新技术Objective-C,SQLite数据库等。

第三章,对电子菜单系统结构设计、系统结构功能、运行环境等概要分析设计阶段做了大体介绍即需求分析。

第四章,对系统总体流程设计、系统整体框架、后台逻辑处理功能设计和数据库设计作了简要说明具体介绍了系统各功能实现过程。

第五章,大体介绍了对本系统的测试工作,涵盖了测试计划、测试结果以及测试分析这三个方面的内容。

2

河北地质大学本科生毕业设计

第2章 电子菜单应用开发技术简介

该部分主要包括对iOS系统架构的分析、核心操作系统的分析、应用程序框架的分析、内核的分析、开发环境的配置信息、选用数据库描述信息等,具体如下:

2.1 Objective-C简介

Objective-C是非常“实际”的语言。它使用一个用C写成的运行库,只会令应用程序的占得内存增加很小。OC写成的程序通常不会比其源代码大很多。而其函数库(通常附在软件发行本)亦和Smalltalk系统要使用极大的内存来开启一个窗口的情况相反。

Objective-C的最初版本并不支持垃圾回收。在当时这是争论的焦点之一,很多人考虑到Smalltalk回收时有漫长的“死亡时间”,令整个系统失去功用。Objective-C为避免此问题才不拥有这个功能。虽然某些第三方版本已经加入这个功能(尤其是GNUstep),再起Mac OS X 10.3中仍未引入这个功能。不过令人欣慰的是在Apple发布的XCode4中已经支持自动释放,我不敢冒昧的说那是垃圾回收,因为两者机制不同,在xCode4中的自动释放,也就是ARC(Automatic Reference Counting)机制,是不需要用户手动去Release一个对象,而是在编译期间,编译器会自动帮你添加那些以前你经常写[NSObject release]。

另一个问题是OC不包括命名空间机制(namespace mechanism)。取而代之的是程序设计师必须在其类别名称加上前缀,时常引致冲突。在2004年,在Cocoa编程环境中,所有Mac OS X类别和函式均有“NS”作为前缀,例如NSobject或NSButton来清楚分别它们属于Mac OS X核心;使用“NS”是由于这些类别的名称在NeXTSTEP开发时定下。虽然Objective-C是C的母集,但它也不是C的基本型别为第一级的对象。和C++不同,Objective-C不支援运算子多载(它不支持ad-hoc多型)。亦与C++不同,但和Java相同,Objective-C只容许对象继承一个类别(不设多重继承)。Categories和protocols不但可以提供很多多重继承的好处,而且没有很多缺点,例如额外执行时间过重和二进制不兼容。由于OC使用动态运行时类型,而且所有的方法都是函数调用(有时甚至连系统调用(syscalls)也如此),很多常见的编译时性能优化方法都不能应用于OC(例如:内联函数、常数传播、交互式优化、纯量取代与聚集等)。这使得OC性能劣于类似的对象抽象语言(如C++)。不过OC拥护者认为既然OC运行时消耗较大,OC本来就不应应用于C++或Java常见的底层抽象

2.1.1 iOS系统

Cisco的网际操作系统(iOS)是一个为网际互连优化的操作系统--类似一个局域操作系统(nOS)、如Novell的 NetWare,为LANs而进行优化。iOS为长时间有效地维护一个互联网络提供了统一的规则。简而言之,它是一个与硬件分离的软件体系结构,随网络技术的不断发展,可动态地升级以适应不断变化的技术

iOS可以被视作一个网际互连中枢。一个高度智能的管理员,负责管理、控制复杂的分布式网络资源。其早期版本是一个单独系统,基本上以路由器为中心。它被排列成一个过程(Procedure)集,允许任何过程之间相互呼叫。这种单一的结构使数据的隐蔽性和独立性不强。它的大多数操作代码拥有结构和操作的相关性

iPhone是Mac出的封闭手机系统,iPhone相对要稳定,不开放源代码的,扩展相对不足,移植性很好!iPhone开发用的是Objective-C(一种C语言的第三方拓展版),从众面小,

3

河北地质大学本科生毕业设计

不能定制UI(界面),只能进行功能解锁 比如:越狱.iPhone定位于高端手机市场,走的是个性化路线,主要优势是AppStore(移动网上商店),Mac拥有全球最大最成熟的移动网上商店

1.模块性

iOS是Cisco路由软件的初始品牌名称。随着Cisco技术的发展,iOS不断扩展,成为Cisco Central ENgineering(中央工程部门)所称之为的“一系列紧密连接的网际互连软件产品”。尽管在其品牌名识别中,iOS可能仍然等同于路由软件,但是它的持续发展发已使之过渡到支持局域网和ATM交换机,并为网络管理应用提供重要的代理功能。必须强调的是,iOS是Cisco开发的技术:一项企业资产。它给公司提供独特的市场竞争优势。许多竞争者许可iOS在其集线器和中由模块内运行,IOS已尼广泛成为网际互连软件事实上的工业标准。

2.灵活性

基于Cisco产品的工程开发以用户可以获得适应变化的灵活性。iOS软件提供一个可扩展的平台,Cisco会随着需求和技术的发展集成新的功能。Cisco可以更快地将新产品投向市场,我们的客户可以享用这种优势。

3.可伸缩性

iOS遍布网际互连市场;广泛的Cisco使用伙伴及竞争者在他们的产品上支持iOS.iOS软件体系结构还允许其集成构造企业互联网络的所有部分。Cisco已经定义了4个:核心/中枢:网络中枢和WAN服务,包括大型骨干网络路由器和ATM交换机。工作组:从共享型局域网移植到局域网交换(VLANs)提供更优的网络分段和性能。)远程访问:远程局域网连接解决方案;边际路由器、调制解调器等。IBM网际互连:SNA和LAN并行集成,从SNA转换到IP.Cisco的iOS扩展了所有这些领域,提供了支持端到端网际互连的稳健性。

4.可操作性

iOS提供最广泛的基于标准的物理和逻辑协议接口——超过业界任何其他供应商:从双绞线到光纤,从局域网到园区网到广域网,Novell NetWare,UNIX,SNA以及其他许多接口。即是说,一个围绕iOS建立的网络将支持非常广泛的应用。

2.1.2 核心操作系统层和核心服务层

位于iOS系统架构最下面的一层是核心操作层,它包括内存管理,文件管理,电源管理以及一些其他的操作系统业务,它可以直接和硬件设备交互。核心操作系统层包括以下这些组件:OS X Kernel,Mach 3.0,BSD,Sockets,Power Mgmt,File System Keychain,Certificates,Security,Bonjour等

开发人员也可以完全访问核心服务层来方问iOS的一些服务,包括数据库连接,URL学习等等,它主要包括以下这些组件:Collections,Address Book,Networking,File Access,SQLite,Core Location,Net Services,Threading,Preferences,URL Utilities等。

SQLite是嵌入式的和轻量级的sql数据库,广泛用于iOS应用。iOS系统内置SQLite数据库减小了开发人员的负担,是系统的一部分。

Net Servicer主要负责网络服务,在开发过程中,承担应用程序与服务器之间连接的角色,有很强的交互性。

4

河北地质大学本科生毕业设计

媒体层,通过它可以在应用程序中使用各种媒体文件,进行音频与视频的录制,图形的绘制,以及制作基础的动画效果。它包括以下这些组件:Core Audio,OpenGL,Audo Mixing,AudioRecording,VideoPlayback,JPG,PBG,TIFF,PDF,Quartz,CoreAnimation,OpenGL ES。最上面一层是可触摸层,这一层为应用开发提供了各种有用的框架,并且大部分与用户界面有关,本质上来说它负责用户在iOS设备上的触摸交互操作。它包括以下这些组件:Multi-Touch Events,Core Motion,Camera,View Hierarchy,Localization,Alerts,Web Views,Image Picker,Multi-Touch Controls。

在Cocoa Touch层中的很多技术都是基于Objective-C语言的。Objective-C语言为iOS提供了相机集合,文件管理,网络操作等支持。例如UIKit框架,它为应用程序提供了各种可视化组件,窗口(window),视图(view)和按钮组件(UIButton)。Cocoa Touch层中的其他框架,对我们在应用程序中的开发来说也是非常有用的,如访问用户通信录功能框架,获取照片信息功能的框架,负责加速感应器和三维陀螺仪等硬件支持的框架等等。

2.1.3 应用程序框架

编写应用程序项目,都是从CocoaTouch层开始的,具体来说是从UIKit Framework开始的。iOS常用的SDK框架如下:

AddressBook.framework 提供访问存储核心数据库中用户联系人信息的功能。 AddressBook.framework提供一个用户界面,用于显示存储在地址薄中的联系人详情。 AudioUnit.framework提供一个接口,让我们的应用程序可以对音频进行处理。

AudioToolbox.framework和AVFoundation.framework提供音频录制和回放的底层API,同时也负责管理音频硬件。

CFNetwork.framework访问和配置网络,像HTTP,FTP和Bonjour Services等。 CoreFoundation.framework提供抽象的常用数据类型,如Unicode、strings、XML、URL等。

CoreGraphics.framework提供2D绘制的基于C的API。

Foundation.framework提供Objective-C的基础类(像NSObject)、基本数据类型和操作系统服务等。

GameKit.framework为游戏提供网络功能,点对点互联和游戏中的语音交流。 MapKit.framework为应用程序提供内嵌地图的接口。 MediaPlayer.framework提供视频播放和音频的功能。

MessageUI.framework提供视图控制接口用以处理E-mail和短信。

OpenGLES.framework提供简洁而高效的绘制2D和3D图形的OpenGL API。 QuartzCore.framework提供动画特效以及通过硬件进行渲染的能力。 StoreKit.framework为应用程序提供在程序运行中消费的支持。

SystemConfiguration.framework检测当前网络是否可用和硬件设备状态的能力。

2.2 SQLite数据库介绍

SQLite是一个轻量级、跨平台的关系型数据库。既然号称关系型数据库,支持SQL92标准中常用的事务(比如视图、事务、触发器等)就是理所当然的了,具体特色有以下几点:

1.轻量级

5

河北地质大学本科生毕业设计

先说它的第一个特色:轻量级。想必SQLite的创建者很看重这个特性,连它的Logo都是用的“羽毛”,来显摆它的轻飘飘。SQLite和C/S模式的数据库软件不同,它是进程内的数据库引擎,因此不存在数据库的客户端和服务器。使用SQLite一般只需要带上它的一个动态 库,就可以享受它的全部功能。而且那个动态库的尺寸也挺小,以版本3.6.11为例,Windows下487KB、Linux下347KB等。

2.绿色软件

SQLite的另外一个特点是绿色:它的核心引擎本身不依赖第三方的软件,使用它也不需要“安装”。所以在部署的时候能够省去不少麻烦。

3.单一文件

所谓的“单一文件”,就是数据库中所有的信息(比如表、视图、触发器、等)都包含在一个文件内。这个文件可以copy到其它目录或其它机器上,也照用不误。

4.跨平台/可移植性

如果光支持主流操作系统,那就没啥好吹嘘的了。除了主流操作系统,SQLite还支持了很多冷门的操作系统。我个人比较感兴趣的是它对很多嵌入式系统(比如Android、Windows Mobile、Symbin、Palm、VxWorks等)的支持。

5.内存数据库(in-memory database)

SQLite的API不区分当前操作的数据库是在内存还是在文件(对于存储介质是透明的)。所以如果你觉得磁盘I/O有可能成为瓶颈的话,可以考虑切换为内存方式。切换的时候,操作SQLite的代码基本不用大改,只要在开始时把文件Load到内存,结束时把内存的数据库Dump回文件就OK了。

2.3 Xcode

Xcode2.0是开发人员建立Mac OS X应用程序的最快捷方式,也是利用新的苹果电脑公司技术的最简单的途径。Xcode2.0将Mac OSX的轻松使用,UNIX 能量以及高性能的开发技术集合在一起。

不管你用C、C++、Objective-C或 Java编写程序,在AppleScript里编写脚本,还是试图从另一个奇妙的工具中转移编码,你会发现Xcode编译速度极快。每次操作都很快速和轻松。

Xcode4的虚拟模型和设计功能让你可以更轻松的开发和维护应用程序。只需选择应用程序中想要编写的部分,然后模型和设计系统将自动创建分类图表,不仅可以显示编码,还可以让你进行浏览。Mac OS X Core Data API 帮你的应用程序创建数据结构。更棒的是,它还自动提供撤消、重做和保存功能,无需编写任何编码。

Xcode整合的 Apple Reference Library为所有的Apple开发者文件提供一个单独的搜索和显示界面,这些文件包括来自苹果电脑公司网站的在线文件,以及存放在你电脑上的文件。新的参考资料库甚至可以帮你将定期更新资料下载到你的电脑,保持文件的最新状态。Xcode 将帮你快速找到最新的答案。

Xcode4的核心部分是苹果电脑公司下一代业界标准的gcc编译器gcc4.0。新的编译器利用许多先进的最优化技术帮你从现存编码中获得更多性能。从超级计算世界借鉴来的自动向量化(Auto-vectorization)技术可以帮助你释放每台 Intel 系统中速度引擎的能量,而不需要编写向量化编码。其他的最优化工具则支持反馈定向的最优化,以及隐藏模

6

河北地质大学本科生毕业设计

块分析。

Xcode 将赋予你创建诸如计算和渲染引擎应用程序的能力,这些应用程序使用64位内存定址。这非常适合数据集中的应用程序,其通过访问内存中的数据运行速度更快,远胜于磁盘访问。Xcode将为你提供工具来建立并调试适合 IntelCore i5, i7 和Mac OSX Lion的32或64位应用程序,还可以让你创建包含32位和64位执行能力的 Fat Binaries。

众所周知,在构建中引进多重处理器可以提高速度,Xcode 能帮你实现这个明显的结论。利用支持 Rendezvous 的分布式构建功能,可以轻易地把编译工作量分散到闲置的电脑上来寄放构建,或者更好是在单独的电脑上开发一个专门的 Xserve 构建寄放区,快速处理那些耗时的任务。

7

河北地质大学本科生毕业设计

第3章 电子菜单app需求分析

根据第一章所定义的课题研究方向及目标,本章将对系统功能进行具体的需求分析,具体分析电子菜单app所要实现的功能以及欲达到的效果,具体内容如下章节:

3.1 电子菜单app的可行性分析

1.使用objective-C编程技术

Objective-C是非常实际的语言,他是一个用C写成、很小的运行库,只会令程序的尺寸增加很小,和大部分oo系统使用极大的vm执行时间会取代整个系统运作相反,Objective-C写的程序通常不会比起原始代码大很多,而其函数库亦和Smalltalk系统要使用极大的内存来开启一个窗口的情况相反,因objective-C它完全兼容标准C语言,C语言具有的高效性也被objective-C继承,但是我们用的objective-C并不像C语言用起来那么的复杂,因为它是对C的封装,把复杂高效的语言变得简单高效,这样更利于iOS开发者使用,也为iOS开发者带来了便捷。 (1)动态绑定

函数和消息的最根本不同是:函数和它的参数是在编译的时候已经确定下来,但是消息和接收对象知道程序已经在运行,消息在传递时才能确定下来。确切的消息方法实现依赖于消息的接收者,不同的接收者可能有相同的方法名不同的方法实现,只有在消息接收时才能确定(动态类型),通过源代码的类型定义并不能完全确认接收者的类型。运行时消息例程查找接收者和消息方法,找到消息方法实现的机器码,呼叫这个方法,传递给它消息实例变量指针 (2)多态性

在Objective-C中消息的调用看上去和标准C中的函数调用相似,但因为方法属于一个对象,消息的行为与函数调用还是不同。在一些情况下,一些对象仅能对针对它涉及的方法起作用,不能被其他类的方法使用,即使这些类有同样名称的方法。这意味着两个对象对同样的消息有着不同的响应,即多态性。Objective-C中多态性和动态绑定配合使用,可以使代码提供给任意数量不同类型的对象使用,这些对象不需要再写代码的时候就已经定义好,它们可以是以后开发的对象,也可以是其他项目的对象。 (3)面向对象

面向对象程序构建在多种对象之上,基于Cocoa框架的程序可能使用NSMatrix对象、NSWindow对象、NSDirectonary对象、NSFont对象以及许多其它对象。在Objective-C中通过定义类来定义对象。面向对象让开发者更容易开发应用程序软件,以及更加规范化。 (4)继承性

类的定义是累进的,任一个新类都是在另一个类的基础上定义的,新类继承了它的方法和实例变量。继承使所有的类构成一颗树形的结构,在Objective-C中使用类一般要继承或间接继承于基类:NSObject,因为NSObject提供了大量的有用特性。比如,一些图形类,需要继承于Shape类,而Shape是Graphic类的子类,Graphic又继承于NSObject类,因此,还是间接继承于NSObject类。类的继承关系图3-1所示:

8

河北地质大学本科生毕业设计

图3-1 Objective-C类继承图

在项目中NSObject集合了所有类的基本方法,所有的=类都继承或者间接继承NSObject。

2.社会市场因素可行性

伴随着餐饮行业的快速发展,菜单也发生了重大演变,从挂牌菜单、华丽纸质菜单到点菜宝的兴起,再到电子菜单的横空出世,无一不体现着餐饮业及消费者对点菜方式的重视。基于平板电脑的电子菜单因良好的客户体验、更新及时、信息容量大等优势成为了餐饮界的新一代宠儿。

按照目前市场情形,越来越多的移动开发者涌进iOS开发领域。iOS平台上应用软件,App Store的支付模式更为成熟而且有监管,另外iOS的兼容性问题小,开发人员不用考虑太多的配置兼容问题,美观大方的外形,更是吸引了大量的用户。而且其良好的用户体验,都为iOS的发展奠定了良好的基础。 3.硬件工具可行性

使用工具方面,开发工具iOS xcode5.0版本,要求Mac10.8操作系统,一台已经安装有所有必备的软件及相应软件设备的计算机;内存要求大于或等于2G。

3.2 电子菜单app功能需求分析

电子菜单app,设计大致划分为5个主要模块,包括历史菜单、菜品介绍、我的菜单、餐位选择和提交订单。每个模块各司其职,在整个工程中又到了MVC模式,单例模式,通知模式,使每个功能模块化,各模块之间的耦合度降到最低,有利于后期代码的维护,模块化的设计也使得app看起来更有条理性,下面就是对模块化的图文解释,具体如图3-2-1:

9

河北地质大学本科生毕业设计

图3-2-1 模块展示

此图清晰的展示了app的功能模块之间的跳转交互,app的重点在于展示菜品的图片和介绍,以及用户点餐并提交订单等功能。历史菜单可以向用户展示已有的数据,提供借鉴和参考。根据不同的菜系,选择不同系列的菜品,点菜后会在我的菜单向用户展示已经点好的菜品,选择餐位后即可提交订单,等待上菜。 1.app登陆功能需求

为了避免用户注册登陆的繁琐操作,此项目弱化了用户的注册登陆部分,采用按钮点击事件直接登陆,或者可以联网,通过web页加载本餐厅的介绍。 2.app历史菜单功能需求

应用历史菜单的展示有一个表格控制器UITableView来进行展示数据内容,由xib可视化编程和代码两者结合实现,可以展示历史日期、时间和桌号等内容,还包括删除和查询按钮。

3.app历史菜单详情功能需求

历史菜单详情是由历史菜单中点击查询按钮,模态弹出一个窗口,通过前一个界面向后传值,以这个值为索引,从数据库中取出相应的数据,保存到数组中,再通过UITableView展示到界面上来。

4.app菜品介绍功能需求

根据不同的菜系选择,通过UITableView展示不同的菜品分类和名称,通过

UIScrollerView展示对应菜品的图片,通过UILable向用户展示已经点了多少种菜,界面布局还包括点菜按钮、详情按钮和我的菜单按钮。默认选择的是主厨推荐对应的菜品。 5.app我的菜单功能需求

在菜品介绍界面可以通过点击点菜按钮把用户点击的菜品数据加到数据库中,再在我的菜单界面通过UITableView进行信息展示。包括序号、菜名、单价、种类、份数、备注以及参考价格,其中份数和备注可以用户手动修改或添加。点击右下角的送单按钮,会模态弹出送单界面。 6.app送单功能需求

送单界面通过四个UITextField和两个UIButton布局,其中用餐人数、VIP号、工号和密码是UITextField,可以输入文字(或者不输入,这部分弱化,主要体现功能)。餐位选择按钮,其点击事件会触发模态弹出餐位选择界面。点击送单按钮,会判断是否已经

10

河北地质大学本科生毕业设计

选择餐位,如果已经选好,便立即送单,否则会弹出UIAlertView,提示用户进行餐位选择。

7.app餐位选择功能需求

在餐位选择界面是本餐厅的俯视缩略图,显示每个房间的位置以及名称。在相应位置布局UIButton,当触发点击事件时,一方面模态弹回该界面,另一方面发出通知,通知送单界面在餐位选择按钮处显示刚刚点击的房间名称。

11

河北地质大学本科生毕业设计

第4章 电子菜单app设计

系统设计阶段主要的任务是系统各个模块的具体设计与实现。

4.1 辅助功能设计

4.1.1 数据库操作功能

在本项目中数据的获取和保存都是基于对数据库的操作,为了降低类之间的耦合度,便于代码为维护和修改,将对数据库的增删改查操作封装到一个继承于NSObject的名为DataBaseTool 类中,定义为类方法,以便通过类名调用方法。

在DataBaseTool.h中声明加号方法,在其他类中需要使用数据库时,才可以调用相应的方法,代码详情见附录A。

在DataBaseTool.m中是以上方法的具体实现,借助第三方库FMDB对数据库进行操作,代码详情见附录B。

4.1.2 跳转动画功能

项目中界面间的切换主要用到的是模态弹出和切换根视图控制器两种方法,因为使用频率很高,所以将视图切换的方法封装,使用时传入要切换的试图控制器减少代码量。另外使用列表控制器UITableView时,有一些界面需要cell的点击事件中让cell做UIView动画,因此将该方法也封装。代码详情见附录C。

4.2 模块功能设计

下面以具体的效果来展示各个功能模块。

4.2.1 登陆和语言选择模块

登陆和语言选择模块在创建视图控制器时使用了xib拖拽控价,因此相对简单,代码量少。运行效果图如下4.2.1-1, 4.2.1-2所示。

图4.2.1-1 登陆界面

12

河北地质大学本科生毕业设计

图4.2.1-2 语言选择界面

界面都是在xib中拖拽一个UIImageView作为背景,在相应的位置上布局UIButton,绑定点击事件,在事件中实现相应的界面跳转。登陆界面代码详见附录D,语言选择界面代码详见附录E。

4.2.2 历史菜单模块

运行效果图如下4.2.2-1所示。

图4.2.2-1 历史菜单界面

13

河北地质大学本科生毕业设计

此界面为历史菜单界面,所有历史点单的基本信息都在本页面进行展示,本页面是由

UITableView和自定义cell来进行信息展示的,展示用的数据是从数据库中读取出来,封装成模型。每一条数据的具体内容体现在每个cell上,信息的布局由xib完成,将自定义cell上的控件设置成属性,在UITableView的协议方法中通过点语法对这些属性进行赋值,值的数据就从我们的数据模型里边取出来,赋值实现之后就如同界面上展示的效果一般。 自定义cell如图4.2.2-2所示。

图4.2.2-2 自定义cell的布局

具体的代码实现详见附录F。

4.2.3 历史菜单详情模块

运行效果图如下4.2.3-1所示。

图4.2.3-1 历史菜单详情界面

历史菜单详情界面总体布局是一个UITableView覆盖主要部分,单元格同样是使用自定义cell,在xib下拖拽控件,包括UILabel和UITextField,数据从数据库中获取并封装成Model类,点语法调用自定义cell的控件,把Model类的对象属性一一赋值,将数据的各项信息展示到表格中。正下方用一个Label显示单价乘数量的总和,即参考价格。自定义cell如图4.2.3-2所示。

图4.2.3-2 自定义cell的布局

14

河北地质大学本科生毕业设计

具体代码实现如下详见附录G。

4.2.4 菜品介绍模块

运行效果如下图4.2.4-1,图4.2.4-2所示。

图4.2.4-1主厨推荐界面

图4.2.4-2 其他选项界面

菜品介绍是本项目的重中之重,因其复杂度,而且为了降低类的耦合和每个类中的代码量,将该模块大致分为三个部分,包括选项卡,主菜单,主厨推荐。

15

河北地质大学本科生毕业设计

1. 选项卡部分

最右侧的选项卡部分是在视图控制器xib上拖拽了一个UITableView,给每个cell的imageView属性赋值不同的图片,并且设置一个全局变量记录当前选择的是哪一个cell,被选中的cell赋值高亮状态的图片。并且将这个值传递给主菜单部分。 具体代码实现详见附录H。

2. 主菜单部分

当用户选择右侧的某一选项卡时,页面的其他部分的展示数据是根据不同选项卡对应的值,从数据库中取出的不同数据。

主菜单部分的布局主要是由列表控制器UITableView和滑动视图UIScrollerView一一对应组成,即菜品的名称和图片对应,当用户点击UITableView上的菜品名称时UIScrollerView会滑动到对应的图片,同理若用户滑动UIScrollerView浏览菜品图片时UITableView会跳转到对应菜品名称的单元格。 具体代码实现详见附录I。

主菜单部分还包括三个按钮,分别是点菜、详细和我的菜单。由上述代码也可以看到,其中点菜按钮的点击事件中会将当前选中的菜品数据存储到数据库的一个分类下,即用户选中的当前菜品。其中详细按钮的点击事件中则是模态弹出一个小窗口,传值到视图控制器中,用于向用户展示当前菜品的具体信息,其中我的菜单按钮的点击事件则是跳转到我的菜单界面。

菜品详细信息界面代码如下所示:

- (void)viewDidLoad {

[superviewDidLoad];

self.pictureImg.image = [UIImageimageNamed:self.menu.menu_picName]; self.dishNameLab.text = self.menu.menu_name; self.dishNameLab.textColor = [UIColoryellowColor]; }

#pragma mark - 点击按钮关闭模态弹出的该界面 - (IBAction)returnBtnClick:(id)sender {

[selfdismissViewControllerAnimated:YEScompletion:nil]; }

3. 主厨推荐部分

这一部分充分利用了Objective-C语言的继承特性,子类继承了父类,同样就拥有了父类所有的方法和属性(成员变量)。考虑到主厨推荐界面与其他几个界面控件功能完全相同,只是控件的位置有所不同,因此主厨推荐的视图控制器继承与主菜单的视图控制器,这样就没必要别写重复的代码,可重用性很高。即ChefViewController : MenuViewController

4.2.5 我的菜单模块

运行效果如下图4.2.5-1所示。

16

河北地质大学本科生毕业设计

图4.2.5-1 我的菜单界面

我的菜单界面即用户已经点单的展示部分,UITableView覆盖主体部分,自定义cell因为格式和历史菜单详情中用到的cell类似,因此可以导入该cell的头文件,使用即可,这里也体现了Objective-C封装特性的优势,不同的是这里的份数和备注文本框是允许用户定义的。数据是在主菜单界面用户点菜后存储到数据库中的,此时从数据库中取出,赋值给相应的cell控件。

代码具体实现详见附录J。

4.2.6 送单模块

运行效果如下图4.2.6-1所示。

图4.2.6-1 送单界面

送单模块重点放在了餐位选择和送单上,其中餐位选择是必须的,如果没有选择就餐

17

河北地质大学本科生毕业设计

位置,则无法完成送单。选定就餐位置后点击送单按钮,在按钮的点击事件中会将用户的点单信息保存到数据库中,以便后厨获取数据,完成后续工作。同时为了减免用户使用的繁琐程度,其他的用餐人数、VIP号、工号和密码都是选填项。 代码具体实现详见附录K。

4.2.7餐位选择模块

运行效果如下图4.2.7-1所示。

图4.2.7-1 餐位选择界面

餐位选择模块主要由一系列覆盖在餐厅俯视地图房间上的UIButton组成,这些按钮绑定同一个方法,根据不同的tag值区分。用户选定就餐位置时会发出通知,将该房间的名称以参数的形式发送,在送单界面使用该参数显示对应的房间名称。

代码具体实现详见附录L。

18

河北地质大学本科生毕业设计

第5章 系统测试

系统测试是保证系统质量和可靠性的关键步骤,是对系统开发过程中的系统分析系统设计和实施的最后复查。根据测试的概念和目的,在进行信息系统测试。

5.1 功能模块测试

1.数据读取显示模块的测试,主要测试从数据库中获取的数据是否能正确显示,不出现闪退的情况。刚开始调试的时候系统总会报出数组越界的错误。查了网上的博客才明白,原来视图控制器加载视图时会先去执行UITableView的协议方法,再执行ViewDidLoad方法,而获取数据赋值给本地数组的方法恰恰写在了ViewDidLoad方法内,当加载视图时,本地数组为空,就会造成数组越界,因此在获取数据之后要用本地数组调用retain方法,这样就不会出现上述错误了。后来又想到也可以在协议方法中判断数组是否为空,问题可以解决,但是不如调用retain方法更为简单。

2.数据存储模块测试,主要测试提交订单后数据存储是否正确且没有遗漏。经测试,结果如下图5.1-1所示,用户提交的订单完整无误的存储到了数据库中。

图5.1-1 数据存储

3.数据传递模块的测试,主要测试是不是每个界面都能正确的传进来数据,自定义cell上的控件是不是能正确的传值,通知在反向传值的过程中前一界面是否能通过参数获取到正确的值。

在完成逐个模块测试后,开始对系统进行验收测试,运行该系统,在运行过程中查找出现的错误。

5.2 功能整体测试

在安装好配置环境的电脑上测试,刚开始出现屏幕混乱,经过反复修改,现在已经能正常运行。用xcode上自动检测内存工具,检测出多处内存泄露问题,都已经修改。测试到这个阶段就简单多了,繁琐的工作都做完了,不过在这个阶段我还是发现了一个严重的问题,就是内存泄露,原因是我在cell中实例化了一个控件,我当时以为ARC不会有内存泄露,但是还是出现了,cell复用的时候,虽然使用的以前的cell,但是在cell里边申请的控件还会一直开辟空间消耗内存,这样就会导致内存泄露。

19

河北地质大学本科生毕业设计

总结与展望

总结

本项目的开发目标,主要是为了提供可以代替传统纸质菜单的电子菜单,为用户更好的体验电子菜单的便捷。设计经过紧张而有序的系统开发,收获颇丰,感触颇深。

通过这段时间的设计与开发,总体上完成了以下几项工作:

1.研究了Objective-C语言编程理论,参考了一些相关的文献资料,并且使用了一些基本语法和特有性能,对Objective-C语言系统有了一定的认识和了解。

2.研究了界面搭建,SQLite数据库技术,从而为系统原型的实现提供解决方案。 3.在研究设计的基础之上对系统进行实现,该系统大体上实现了总体设计方案中所提到的登录和语言选择、历史菜单、历史菜单详情、菜品介绍、我的菜单、送单和餐位选择等7个模块的功能。

4.对系统进行测试,尽管在测试过程中还有一些尚未解决的问题,但是这些都是预期可以解决的。

展望

基于iOS的电子菜单系统的设计与实现涉及多方面的理论、方法和技术,本系统还有许多新的问题需要解决,需要在实际应用中不断积累和完善,在以下几个方面,还需要做进一步的研究和开发。

1.论文只考虑了电子菜单的几项基本组成,并未在热门排行等方面进行深入发掘。使得系统只考虑了一些简单情况,如何应付复杂的信息还值得加强。可以进一步完善数据库中的相关字段,增加电子菜单系统的完整性。

2.该系统只考虑了电子菜单应用的一些基本情况。比如,未对英语选择等功能进行更为深入的研究,如果数据库中的数据足够完善,界面是可以复用的。

3.系统在测试上还存在一些问题,不过都是预期可以解决的。 4.UITableView,UIScrollerView等相关界面控件在该系统的开发过程中优化还不够,还有提高的余地。

20

河北地质大学本科生毕业设计

参考文献

[1] 谭克强Objective-C程序设计(第四版).

[2] 51cto网站oc教学视频自学。以及对牛人博客的借鉴. [3] 博客园学习,主要学习UI时对我的帮助很大.

[4] cocoaChina第三方库的使用,对后期做毕业设计,提供很多便利.

[5] 个人觉得最好用的还是百度,需要什么查什么,自学学到的东西才理解的更深刻. [6] DaveMak(美)JackNutting(美)JeffLaMarche(美)著.杨越孙文磊等译.ios5基础 教程[M].北京:人民邮电出版社.2013:3.

[7] MarkDalrymple(美)ScottKnaster(美)著.杨越等译.Objective-C基础教程[M].北 京:人民邮电出版社.2012:7.

[8] StephenG.Kochan著.林翼、范俊、朱奕欣译.Objective-C程序设计(第四版)[M]。 北京:电子工业出版社,2012:12.

[9] 克莱尔(美)著.李强译.Objective-C2.0Mac和ios开发实践指南[M].北京:机械 工业61出版社,2011:1.

[10] BrianW.KernighanDeninisMRirchie著,徐宝文,李志(译)TheCProgramming Language[M].北京:机械工业出版社2003:2.

[11] Ronpatton(美)著.王钰,曹跃译.软件测试[M].北京:机械工业出版社,2006. [12] 吴洁明著.软件工程实例教程[M].北京:清华大学出版社,2010:11.

21

河北地质大学本科生毕业设计

致 谢

在本论文的写作过程中,我的指导老师赵冬梅老师倾注了大量的心血,从选题到开题报告,从写作提纲,到一遍又一遍地指出每稿中的具体问题,严格把关,循循善诱,在此我表示衷心感谢,谢谢赵冬梅老师在我撰写论文的过程中给与我的极大地帮助

同时我要感谢一起学习的各位老师、同学和朋友。在整个的论文写作中,各位老师、同学和朋友积极的帮助我查资料和提供有利于论文写作的建议和意见,在他们的帮助下,论文得以不断的完善,最终帮助我完整的写完了整个论文

另外,要感谢在大学期间所有传授我知识的老师,是你们的悉心教导使我有了良好的专业课知识,在继续学习Objective-C语言时少走了许多弯路,感谢这四年来信息工程学院对我的栽培,使我成为了一名合格的理工学子。

22

河北地质大学本科生毕业设计

附录

附录A:

@interfaceDataBaseTool :NSObject

//创建数据库对象

+(FMDatabase *)getDataBase;

//查找groupTable中的内容

+(NSMutableArray *)searchGroupTable;

//查找menuTable中的内容

+(NSMutableArray *)searchMenuTableWithKind:(NSString *)kind;

/*------------------ orderTable ------------------*/ //查找orderTable中的内容

+(NSMutableArray *)searchOrderTable;

//点菜时查询orderTable中是否存在该数据

+(void)searchOrderTableWithMenuID:(Menu *)menu;

//修改orderTable中menuNum和remark数据

+(void)updateOrderTableWithMenuNumTF:(UITextField *)menuNumTF WithOrder:(Order *)order;

+(void)updateOrderTableWithRemark:(UITextField *)remarkTF WithOrder:(Order *)order;

//移除orderTable中的数据 +(void)deleteOrderTable;

/*------------------- group_recordTable ---------------*/ //查询group_recordTable中的数据

+(NSMutableArray *)searchGroup_RecordTable;

//向group_recordTable中插入数据

+(void)insertGroup_RecordTableWith:(group_record *)gRecord;

//清空group_recordTable中的数据 +(void)deleteGroup_RecordTable;

//删除group_recordTable中的一条记录

+ (void)deleteGroup_RecordTableWithgRecordTime:(NSString *)gRecordTime;

/*-------------------- recordTable --------------------*/

23

河北地质大学本科生毕业设计

//查询recordTable中的数据

+(NSMutableArray *)searchRecordTableWithNum:(int)num;

//删除recordTable中的一条数据

+(void)deleteRecordTableWithNum:(int)num;

//向recordTable中插入数据

+(void)insertRecordTableWith:(Record *)record;

//清空recordTable中的数据 +(void)deleteRecordTable;

@end

附录B:

staticFMDatabase * _db;

@implementation DataBaseTool

#pragma mark - 创建数据库对象 +(FMDatabase *)getDataBase {

//copy数据库文件

NSString * filePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0] stringByAppendingPathComponent:@\]; NSLog(@\,filePath);

NSString * path = [[NSBundlemainBundle] pathForResource:@\ofType:@\]; NSFileManager * manager =[NSFileManagerdefaultManager]; if ([manager fileExistsAtPath:filePath] == NO) {

[managercopyItemAtPath:path toPath:filePath error:nil]; }

//创建数据库文件的对象 if (_db == nil) {

_db = [[FMDatabasealloc]initWithPath:filePath]; }

return_db; }

#pragma mark - 查找groupTable中的内容 +(NSMutableArray *)searchGroupTable {

24

河北地质大学本科生毕业设计

if ([_dbopen] == NO) {

[_dbclose]; returnnil; }

FMResultSet * rs = [_dbexecuteQueryWithFormat:@\]; NSMutableArray * array = [[NSMutableArrayalloc]init]; while ([rs next]) {

Group * group =[[Groupalloc]init];

group.group_id = [rs intForColumn:@\];

group.group_kind = [rs stringForColumn:@\]; group.group_name = [rs stringForColumn:@\]; group.group_image = [rs stringForColumn:@\];

group.group_highlightImage = [rs stringForColumn:@\]; [arrayaddObject:group]; [grouprelease]; }

[rsclose]; [_dbclose];

return [array autorelease]; }

#pragma mark - 查找menuTable中的内容

+(NSMutableArray *)searchMenuTableWithKind:(NSString *)kind {

if ([_dbopen] == NO) {

[_dbclose]; returnnil; }

FMResultSet * rs = [_dbexecuteQueryWithFormat:@\iKind = %@\,kind];

NSMutableArray * array = [[NSMutableArrayalloc]init]; while ([rs next]) {

Menu * menu = [[Menualloc]init];

menu.menu_id = [rs intForColumn:@\];

menu.menu_groupID = [rs intForColumn:@\]; menu.menu_iKind = [rs stringForColumn:@\]; menu.menu_name = [rs stringForColumn:@\]; menu.menu_price = [rs intForColumn:@\]; menu.menu_unit = [rs stringForColumn:@\]; menu.menu_detail=[rs stringForColumn:@\];

menu.menu_picName = [rs stringForColumn:@\];

25

河北地质大学本科生毕业设计

[arrayaddObject:menu]; [menurelease]; }

[rsclose]; [_dbclose];

return [array autorelease]; }

#pragma mark - 查找orderTable中的全部内容 +(NSMutableArray *)searchOrderTable {

if ([_dbopen] == NO) {

[_dbclose]; returnnil; }

FMResultSet * rs = [_dbexecuteQueryWithFormat:@\]; NSMutableArray * array = [[NSMutableArrayalloc]initWithCapacity:0]; while ([rs next]) {

Order * order = [[Orderalloc]init];

order.order_ID = [rs intForColumn:@\];

order.order_menuName = [rs stringForColumn:@\]; order.order_Price = [rs stringForColumn:@\]; order.order_kind = [rs stringForColumn:@\];

order.order_menuNum = [rs intForColumn:@\]; order.order_remark = [rs stringForColumn:@\]; [arrayaddObject:order]; [orderrelease]; }

[rsclose]; [_dbclose];

return [array autorelease]; }

#pragma mark -点菜时查询orderTable中是否存在该数据 +(void)searchOrderTableWithMenuID:(Menu *)menu {

if ([_dbopen]== NO) {

[_dbclose]; return; }

FMResultSet * rs =[_dbexecuteQueryWithFormat:@\= %d\,menu.menu_id];

26

河北地质大学本科生毕业设计

if ([rs next]) {

//存在这个数据,改变该数据的menuNum值 int number = [rs intForColumn:@\];

[_dbexecuteUpdateWithFormat:@\id = %d\,number+1,menu.menu_id]; } else {

//不存在该条数据就插入

[_dbexecuteUpdateWithFormat:@\

orderTable(id,menuName,Price,kind,menuNum,remark) VALUES

(%d,%@,%@,%@,%d,%@)\,menu.menu_id,menu.menu_name,[NSStringstringWithFormat:@\%d\,menu.menu_price],menu.menu_iKind,1,@\]; } }

#pragma mark - 修改orderTable中menuNum和remark数据

+(void)updateOrderTableWithMenuNumTF:(UITextField *)menuNumTF WithOrder:(Order *)order {

if ([_dbopen] == NO) {

[_dbclose]; return ; }

[_dbexecuteUpdateWithFormat:@\= %d\,[menuNumTF.textintValue],order.order_ID]; [_dbclose]; }

+(void)updateOrderTableWithRemark:(UITextField *)remarkTF WithOrder:(Order *)order {

if ([_dbopen] == NO) {

[_dbclose]; return ; }

[_dbexecuteUpdateWithFormat:@\= %d\,remarkTF.text,order.order_ID]; }

#pragma mark - 移除orderTable中的数据 +(void)deleteOrderTable {

27

河北地质大学本科生毕业设计

if ([_dbopen] == NO) {

[_dbclose]; return; }

[_dbexecuteUpdateWithFormat:@\]; [_dbclose]; }

#pragma mark - 查询group_recordTable中的数据 +(NSMutableArray *)searchGroup_RecordTable {

if ([_dbopen] == NO) {

[_dbclose]; returnnil; }

FMResultSet * rs = [_dbexecuteQueryWithFormat:@\]; NSMutableArray * array = [[NSMutableArrayalloc]init]; while ([rs next]) {

group_record * gRecord = [[group_recordalloc]init];

gRecord.gRecord_id = [rs intForColumn:@\];

gRecord.gRecord_date = [rs stringForColumn:@\]; gRecord.gRecord_time = [rs stringForColumn:@\]; gRecord.gRecord_room = [rs stringForColumn:@\]; [arrayaddObject:gRecord]; [gRecordrelease]; }

[rsclose]; [_dbclose];

return [array autorelease]; }

#pragma mark - 向group_recordTable中插入数据

+(void)insertGroup_RecordTableWith:(group_record *)gRecord {

if ([_dbopen] == NO) {

[_dbclose]; return; }

[_dbexecuteUpdateWithFormat:@\VALUES

(%@,%@,%@)\,gRecord.gRecord_date,gRecord.gRecord_time,gRecord.gRecord_room];

28

河北地质大学本科生毕业设计

[_dbclose]; }

#pragma mark - 移除group_RecordTable中的所有数据 +(void)deleteGroup_RecordTable {

if ([_dbopen] == NO) {

[_dbclose]; return; }

[_dbexecuteUpdateWithFormat:@\]; [_dbclose]; }

#pragma mark - 删除group_recordTable中的一条记录

+ (void)deleteGroup_RecordTableWithgRecordTime:(NSString *)gRecordTime {

if ([_dbopen] == NO) {

[_dbclose]; return; }

[_dbexecuteUpdateWithFormat:@\LIKE %@\,gRecordTime]; [_dbclose]; }

#pragma mark - 查询recordTable中的数据

+(NSMutableArray *)searchRecordTableWithNum:(int)num {

if ([_dbopen] == NO) {

[_dbclose]; returnnil; }

FMResultSet * rs =[_dbexecuteQueryWithFormat:@\stateNum = %d\,num];

NSMutableArray * array = [[NSMutableArrayalloc]init]; while ([rs next]) {

Record * record = [[Recordalloc]init];

record.record_id = [rs intForColumn:@\];

record.record_stateNum = [rs intForColumn:@\];

record.record_menuName = [rs stringForColumn:@\];

29

河北地质大学本科生毕业设计

record.record_menuPrice = [rs stringForColumn:@\]; record.record_menuKind = [rs stringForColumn:@\]; record.record_menuNum = [rs intForColumn:@\];

record.record_menuRemark = [rs stringForColumn:@\]; record.record_groupID = [rs intForColumn:@\]; [arrayaddObject:record]; [recordrelease]; }

[rsclose]; [_dbclose];

return [array autorelease]; }

//删除recordTable中的一条数据

+(void)deleteRecordTableWithNum:(int)num {

if ([_dbopen] == NO) {

[_dbclose]; return; }

[_dbexecuteUpdateWithFormat:@\= %d\,num]; [_dbclose]; }

#pragma mark - 向recordTable中插入数据 +(void)insertRecordTableWith:(Record *)record {

if ([_dbopen] == NO) {

[_dbclose]; return; }

[_dbexecuteUpdateWithFormat:@\

recordTable(stateNum,menuName,menuPrice,menuKind,menuNum,menuRemark,groupID) VALUES

(%d,%@,%@,%@,%d,%@,%d)\,record.record_stateNum,record.record_menuName,record.record_menuPrice,record.record_menuKind,record.record_menuNum,record.record_menuRemark,record.record_groupID]; [_dbclose]; }

#pragma mark - 删除recordTable中的数据 +(void)deleteRecordTable

30

河北地质大学本科生毕业设计

{

if ([_dbopen] == NO) {

[_dbclose]; return; }

[_dbexecuteUpdateWithFormat:@\]; [_dbclose]; }

@end

附录C:

@implementation ChangeVCTool

//找window切换根视图控制器并做翻转动画

+(void)changeViewController:(UIViewController *)vc {

UIWindow * window = [UIApplicationsharedApplication].delegate.window; window.rootViewController = vc;

[UIViewbeginAnimations:nilcontext:nil]; [UIViewsetAnimationDuration:0.5];

[UIViewsetAnimationTransition:6forView:window cache:YES]; [UIViewcommitAnimations]; }

//cell做UIView动画

+(void)flipSelectCell:(UITableViewCell *)cell {

[UIViewbeginAnimations:nilcontext:nil]; [UIViewsetAnimationDuration:0.5];

[UIViewsetAnimationTransition:2forView:cell cache:YES]; [UIViewcommitAnimations]; }

@end

附录D:

#pragma mark - 网站首页

- (IBAction)loadWebClick:(id)sender {

//用系统浏览器加载网页(这里以百度首页为例,可以写本餐厅的网站首页) [[UIApplicationsharedApplication]

openURL:[NSURLURLWithString:@\]]; }

31

河北地质大学本科生毕业设计

#pragma mark - 点菜系统

- (IBAction)orderDishSystemClick:(id)sender {

LanguageVC * languageVC =[[LanguageVCalloc]init]; // 跳转界面

[ChangeVCToolchangeViewController:languageVC]; }

附录E:

#pragma mark - 点击进入主界面 - (IBAction)goMainVC:(id)sender {

MainViewController * mainVC = [[MainViewControlleralloc]init]; [ChangeVCToolchangeViewController:mainVC]; }

#pragma mark - 返回按钮

- (IBAction)goBackClick:(id)sender {

WelcomeVC * welcomeVC =[[WelcomeVCalloc]init];

[ChangeVCToolchangeViewController:welcomeVC]; }

#pragma mark - 历史菜单

- (IBAction)historyOrderClick:(id)sender {

HistoryOrderViewController * historyOrderVC = [[HistoryOrderViewControlleralloc]init]; [selfpresentViewController:historyOrderVC animated:YEScompletion:nil]; }

附录F:

- (void)viewDidLoad {

[superviewDidLoad]; //注册单元格

[self.historyOrderTableViewregisterNib:[UINibnibWithNibName:@\bundle:nil] forCellReuseIdentifier:@\];

_groupRecordArr = [DataBaseToolsearchGroup_RecordTable]; [_groupRecordArrretain]; }

#pragma mark - 表的协议方法

32

河北地质大学本科生毕业设计

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

return_groupRecordArr.count; }

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

HistoryOrderCell * cell = [tableView

dequeueReusableCellWithIdentifier:@\forIndexPath:indexPath];

group_record * gRecord = [_groupRecordArrobjectAtIndex:indexPath.row]; cell.dateLab.text = gRecord.gRecord_date; cell.timeLab.text = gRecord.gRecord_time; cell.roomLab.text = gRecord.gRecord_room; cell.searchBtn.tag = indexPath.row+1;

[cell.searchBtnaddTarget:selfaction:@selector(showDetails:) forControlEvents:UIControlEventTouchUpInside]; cell.deleteBtn.tag = indexPath.row+1;

[cell.deleteBtnaddTarget:selfaction:@selector(deleteBtnClick:) forControlEvents:UIControlEventTouchUpInside]; return cell; }

#pragma mark - 点击查询显示该条历史记录的详细信息 -(void)showDetails:(UIButton *)sender {

DetailHistoryViewController * detailHistoryVC = [[DetailHistoryViewControlleralloc]init]; detailHistoryVC.selectRow = sender.tag;

[selfpresentViewController:detailHistoryVC animated:YEScompletion:nil]; }

#pragma mark - 点击删除按钮删除该条记录 - (void)deleteBtnClick:(UIButton *)btn {

ALERTVIEWWITHTAG(@\确定要删除该条记录么?\, btn.tag); }

#pragma mark - 关闭按钮

- (IBAction)closeBtnClick:(id)sender {

[selfdismissViewControllerAnimated:YEScompletion:nil]; }

#pragma mark - 清空按钮

- (IBAction)moveAllDateClick:(id)sender {

ALERTVIEWWITHTAG(@\确定要清空所有历史记录么?\, 1000); }

33

河北地质大学本科生毕业设计

#pragma mark - UIAlertViewDelegate

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {

if (buttonIndex == 1) {

if (alertView.tag == 1000) {

[DataBaseTooldeleteGroup_RecordTable]; [DataBaseTooldeleteRecordTable];

NSUserDefaults * defaults = [NSUserDefaultsstandardUserDefaults]; [defaults setInteger:0forKey:@\]; } else

{

group_record * gRecord = [_groupRecordArrobjectAtIndex:alertView.tag-1];

[DataBaseTooldeleteGroup_RecordTableWithgRecordTime:gRecord.gRecord_time]; [DataBaseTooldeleteRecordTableWithNum:alertView.tag]; }

_groupRecordArr = [DataBaseToolsearchGroup_RecordTable]; [_groupRecordArrretain];

[self.historyOrderTableViewreloadData]; } }

附录G:

- (void)viewDidLoad {

[superviewDidLoad];

_historyOrderArr = [DataBaseToolsearchRecordTableWithNum:self.selectRow]; [_historyOrderArrretain]; [selfresetPriceLab];

[self.tableViewregisterNib:[UINibnibWithNibName:@\bundle:nil] forCellReuseIdentifier:@\]; }

#pragma mark - 表的协议方法

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

return_historyOrderArr.count; }

34

河北地质大学本科生毕业设计

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

CustomCell * cell = [tableView

dequeueReusableCellWithIdentifier:@\forIndexPath:indexPath]; cell.selectionStyle = UITableViewCellSelectionStyleNone;

Record * record = [_historyOrderArrobjectAtIndex:indexPath.row];

cell.idLab.text = [NSStringstringWithFormat:@\,record.record_groupID]; cell.menuNameLab.text = record.record_menuName; cell.priceLab.text = record.record_menuPrice; cell.kindLab.text = record.record_menuKind;

cell.menuNumTF.text = [NSStringstringWithFormat:@\,record.record_menuNum]; cell.remarkTF.text = record.record_menuRemark;

cell.menuNumTF.userInteractionEnabled = NO; cell.remarkTF.userInteractionEnabled = NO; return cell; }

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

[tableViewdeselectRowAtIndexPath:indexPath animated:YES]; }

#pragma mark - 设置价格lab -(void)resetPriceLab {

int totalPrice = 0;

for (Record * record in_historyOrderArr) {

int price = [record.record_menuPriceintValue] * record.record_menuNum; totalPrice = totalPrice + price; }

self.priceLab.text = [NSStringstringWithFormat:@\,totalPrice]; }

#pragma mark - 关闭按钮 - (IBAction)exitClick:(id)sender {

[selfdismissViewControllerAnimated:YEScompletion:nil]; }

附录H:

35

河北地质大学本科生毕业设计

- (void)viewDidLoad {

[superviewDidLoad];

self.rightOptionTableView.rowHeight = 100;

self.rightOptionTableView.separatorStyle = UITableViewCellSeparatorStyleNone; self.rightOptionTableView.backgroundColor = [UIColorclearColor];

_groupArr = [DataBaseToolsearchGroupTable]; [_groupArrretain];

[selfloadMenuVCWithIndex:0]; }

#pragma mark - 表的协议方法

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

return_groupArr.count; }

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

staticNSString * cellIdentifier = @\;

UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; if (cell == nil) { cell =

[[[UITableViewCellalloc]initWithStyle:UITableViewCellStyleValue1reuseIdentifier:cellIdentifier]autorelease]; }

cell.backgroundColor = [UIColorclearColor];

cell.selectionStyle = UITableViewCellSelectionStyleNone;

Group * group = [_groupArrobjectAtIndex:indexPath.row]; if (_currentRow == indexPath.row) {

cell.imageView.image = [UIImageimageNamed:group.group_highlightImage]; } else {

cell.imageView.image = [UIImageimageNamed:group.group_image]; }

return cell;

36

河北地质大学本科生毕业设计

}

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

_currentRow = indexPath.row;

[self.rightOptionTableViewreloadData];

[selfloadMenuVCWithIndex:indexPath.row]; }

#pragma mark - 加载点菜界面

-(void)loadMenuVCWithIndex:(int)index {

//点菜界面

[_menuVC.viewremoveFromSuperview];

if (index == 0) {

_menuVC = [[ChefViewControlleralloc]init]; } else {

_menuVC = [[MenuViewControlleralloc]init]; }

_menuVC.rightTB_selectRow = index;//传值

_menuVC.group = [_groupArrobjectAtIndex:index];

[self.viewaddSubview:_menuVC.view];

//将右侧选项卡放到最上面

[self.viewbringSubviewToFront:self.rightOptionTableView]; }

附录I:

- (void)viewDidLoad {

[superviewDidLoad];

[[NSNotificationCenterdefaultCenter] addObserver:selfselector:@selector(changeLab) name:@\object:nil];

#pragma mark - 设置标题图片

37

本文来源:https://www.bwwdw.com/article/pms.html

Top