iOS 第三章设计模式
目标
IOS 开发框架
IOS 常用设计模式
IOS 程序状态
IOS 程序生命周期—UIApplication
IOS 开发中 IBOutlet IBAction
IOS 文本框及其代理类的使用
1、IOS 开发框架
什么是开发框架?
我们把常用的类,打包整理成一个库,可以重复使用。
框架是实际的产品。
什么是设计模式?
为常见问题提供一组通用、可复用、经过测试的解决方案。
设计模式不是具体的某段固定的代码。可以理解为写作文时候的“总分总”的万金油写法。
设计模式是是一个综合体。
开发框架与设计模式的关系?
(1)框架定义了应用程序的整体结构(类图)
(2)框架定义了类和对象的关系
(3)框架强调复用
(4)框架设计的时候通常使用各种设计模式
设计模式有什么好处?
设计模式不局限与某种语言,从生活中总结而来,应用到程序开发中。
一招鲜,吃遍天下----MVC
2、IOS 常用设计模式
MVC
数据模型(Model)– 界面视图(View) – 代码控制(Controller)
委托(Delegate)
把实现方法的责任委托给另一个不同的对象,让两个对象共同完成一件事情。
单体(单例)
全局对象
只有一个
应用中的其他类都可以访问
分类
它允许我们为一个”已有的类”添加新的方法
3、IOS 程序状态
IOS系统的资源是有限的,应用程序在前台和在后台的状态是不一样的。在后台时,程序会受到系统的很多限制,这样可以提高电池的使用和用户体验。
开发app,我们要遵循apple公司的一些指导原则,原则如下:
Application State
应用程序状态
说明
Not running
未运行
程序没启动
Inactive
未激活
程序在前台运行,不过没有接收到事件。在没有事件处理情况下程序通常停留在这个状态
Active
激活
程序在前台运行而且接收到了事件。这也是前台的一个正常的模式
Backgroud
后台
程序在后台而且能执行代码,大多数程序进入这个状态后会在在这个状态上停留一会。时间到之后会进入挂起状态(Suspended)。有的程序经过特殊的请求后可以长期处于Backgroud状态
Suspended
挂起
程序在后台不能执行代码。系统会自动把程序变成这个状态而且不会发出通知。当挂起时,程序还是停留在内存中的,当系统内存低时,系统就把挂起的程序清除掉,为前台程序提供更多的内存
4、IOS 程序生命周期—UIApplication
查看 IOS 项目中的 main.m 文件,发现里面代码都是这样:
#import<UIKit/UIKit.h>
#import"XXXAppDelegate.h"
int main(int argc, char *argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([XXXAppDelegate class]));
}
}
UIApplicationMain函数作用,只在 main() 函数中被调用,创建 UIApplication 对象和 xxxDelegate 对象
完整的代码应该如下:
intmain(int argc, char *argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, UIApplication, NSStringFromClass([AppDelegate class]));
}
}
UIApplicationMain主要
(1)创建一个UIApplication对象和一个UIApplicationDelegate对象
(2)设置事件循环,然后开始处理事件。
例子:
开会:-UIApplicationMain
老板+秘书
老板:代表整个公司,会议中露面、讲话;-UIApplication
秘书:安排整个会议的行程(会议的生命周期)-xxxxDelegate
了解会议召开的信息(时间、地点、主题);-NoRunning
请示老板批准参加会议; - Inactive
准备会议文件; - Action
联系衣食住行; - background
确定会议的时间表; - Suspended
会议结束整理会议纪要;
确定人手 、 分工.
UIApplicationMain(argc,argv, UIApplication, NSStringFromClass([AppDelegate class]));
开会(xx,xx,老板,秘书);
下图说明了程序运行过程中,所有参与程序运行的对象。有些对象我们不能修改,有些对象我们可以修改。
体现了三种设计模式:MVC、代理(Application Delegate)、单例(UIApplication、UIWindow这两个对象,不允许我们修改,整个程序中只创建一次)
Application 生命周期 在协议 UIApplicationDelegate 中定义
(1)didFinishLaunchingWithOptions-加载完成,即将显示
(2)applicationDidBecomeActive-进入活动状态,正在运行
Application windows are expected to have a root view controller at the endof application launch
(3)applicationWillResignActive-释放活动状态
(4)applicationDidEnterBackground-释放活动状态,自动进入后台
(5)applicationWillEnterForeground-从后台再次进入前台状态,自动进入 Active 状态
//正常启动
-------1 didFinishLaunchingWithOptions 只运行一次,确保界面加载一次
-------5 applicationDidBecomeActive
//按 Home 键
-------2 applicationWillResignActive
-------3 applicationDidEnterBackground
//按图标,重新启动
-------4 applicationWillEnterForeground
-------5 applicationDidBecomeActive
//按 Home 键
-------2 applicationWillResignActive
-------3 applicationDidEnterBackground
//在后台删除程序
--------6 applicationWillTerminate
5、IOS 开发中 IBOutlet IBAction
在 IOS 开发中,采用 MVC 设计模式,把 View 界面通过IB(Inte易做图ceBuilder) xxxViewController.xib 来创建。
如果希望界面上的组件,点击后有反映,需要用代码控制,代码在
xxxViewController.h xxxViewController.m 控制器中。
问题:如何知道代码中的某个量 或 函数,指向界面上的某个组件?
解决:在 OC 代码中,添加两个 “标示符”
IBOutlet 关联组件和代码,代码能够控制组件上的”值”;
IBAction 关联组件和代码,代码能够对按钮的 “事件”做响应;
如何实现:
(1)先在控制类中 手写 IBOutlet IBAction 代码,然后在 xib 中连线;
(2)不写代码,直接通过 IB 的“助手”工具,直接连线并且自动生成 IBOutlet
IBAction 代码 (强烈推荐)
6、IOS 文本框及其代理类的使用
IOS 库中提供了为所有 UIKit组件,都提供了两个定义,一个是类定义、一个是协议定义。如文本框:
UITextField : 提供了界面的各个属性,仅限于界面
UITextFieldDelegate : 提供了能够对文本框所做操作的定义
API 原文
The UITextFieldDelegate protocol defines themessages sent to a text field delegate as part of the sequence of editing itstext. All of the methods of this protocol are optional.
翻译
UITextFieldDelegete 协议定义了在一个文本框中,按照顺序,编辑里面文字的时候,传递给它的 delegete 的消息。
协议方法说明
-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField{
//返回一个BOOL值,指定是否循序文本字段开始编辑
return YES;
}
-(void)textFieldDidBeginEditing:(UITextField *)textField{
//开始编辑时触发,文本字段将成为first responder,一般默认
[textField becomeFirstResponder];
}
-(BOOL)textFieldSho
补充:移动开发 , IOS ,