iOS 第三章设计模式

来源:互联网 发布:淘宝流量包 编辑:程序博客网 时间:2024/06/16 02:46

目标

    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 aroot 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(InterfaceBuilder) 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)textFieldShouldEndEditing:(UITextField *)textField{

    //返回BOOL值,指定是否允许文本字段结束编辑,当编辑结束,文本字段会让出first responder

    //要想在用户结束编辑时阻止文本字段消失,可以返回NO

    //这对一些文本字段必须始终保持活跃状态的程序很有用,比如即时消息

    return NO;

}

 

-(BOOL)textField:(UITextField*)textField shouldChangeCharactersInRange:(NSRange)rangereplacementString:(NSString *)string{

    //当用户使用自动更正功能,把输入的文字修改为推荐的文字时,就会调用这个方法。

    //这对于想要加入撤销选项的应用程序特别有用

    //可以跟踪字段内所做的最后一次修改,也可以对所有编辑做日志记录,用作审计用途。  

    //要防止文字被改变可以返回NO

    //这个方法的参数中有一个NSRange对象,指明了被改变文字的位置,建议修改的文本也在其中

    return YES;

}

/////////////////////////////////////

//限制用户输入字符长度,超过长度,自动截取

-(BOOL)textField:(UITextField *)textFieldshouldChangeCharactersInRange:(NSRange)range replacementString:(NSString*)string

{

 if ([textField.text length] > MAXLENGTH)

 {

  textField.text = [textField.textsubstringToIndex:MAXLENGTH-1];

  return NO;

 }

 return YES;

}

/////////////////////////////////////

 

-(BOOL)textFieldShouldClear:(UITextField *)textField{

    //返回一个BOOL值指明是否允许根据用户请求清除内容

    //可以设置在特定条件下才允许清除内容

    return YES;

}

-(BOOL)textFieldShouldReturn:(UITextField*)textField{

    //返回一个BOOL值,指明是否允许在按下回车键时结束编辑

    //如果允许要调用resignFirstResponder方法,这回导致结束编辑,而键盘会被收起

    [textField resignFirstResponder];//查一下resign这个单词的意思就明白这个方法了

    return YES;

}

 

 

--------------------------------

练习一:掌握UITextFieldDelegate 与 UITextField 配合应用

(1)当text field 获得焦点时,是把text field 的背景色设置为绿色.

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{

    NSLog(@"textFieldShouldBeginEditing:");

    return YES; 

}

- (void)textFieldDidBeginEditing:(UITextField *)textField {

    NSLog(@"textFieldDidBeginEditing:");

    textField.backgroundColor =[UIColor greenColor];

}

 

(2)当text field失去焦点之前会调用textFieldShouldEndEditing。在示例中,我们使用textFieldShouldEndEditing:让背景色返回最初的颜色。

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField{

    NSLog(@"textFieldShouldEndEditing:");

    textField.backgroundColor =[UIColor whiteColor];

    return YES;

}

- (void)textFieldDidEndEditing:(UITextField *)textField{

    NSLog(@"textFieldDidEndEditing:");

}

(3)当用户输入字符的时候,需要监测输入字符的长度,大于10,不允许输入

- (BOOL)textField:(UITextField *)textFieldshouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{

    NSCharacterSet*doneButtonCharacterSet = [NSCharacterSet newlineCharacterSet];

    NSRange replacementTextRange =[text rangeOfCharacterFromSet:doneButtonCharacterSet];

    NSUInteger location =replacementTextRange.location;

    if (textView.text.length +text.length > 10){

    if (location != NSNotFound){

        [textViewresignFirstResponder];

   }

    return NO;

    }

    else if (location !=NSNotFound){

    [textViewresignFirstResponder];

    return NO;

    }

    return YES;

}

 

每次用户通过键盘输入字符时,在字符显示在text Field之前,textField:shouldChangeCharactersInRange:replacementString方法会被调用。这个方法中可以方便的定位测试用户输入的字符,并且限制用户输入特定的字符。在上面的代码中,我使用done键来隐藏键盘:通过检测看replacement文本中是否包含newLineCharacterSet任意的字符。

 

如果有一个字符是来自newLineCharacterSet的,那么说明done按钮被按过了,因此应该将键盘隐藏起来。另外,在用户每次输入内容时,还检测text Field当前文本内容的长度,如果大于140个字符,则返回NO,这样text Field就可以限制输入10个字符了。

 

 

练习二:与文本框类似的一个组件,UITextView  允许用户输入多行文字,请自己查询API ,练习上述同样的例子,仔细理解 UITextView  与 UITextViewDelegate 之间的配合使用。

 

课程代码1下载: http://pan.baidu.com/share/link?shareid=297064859&uk=3189484501

课程代码2下载:  http://pan.baidu.com/share/link?shareid=300297898&uk=3189484501

 

原创粉丝点击