UI_设计模式_Delegate

什么是delegate模式

  1. 当一个类的某些功能需要被别人来实现,但是既不明确是些什么功能,又不明确谁来实现这些功能的时候,就要使用委托模式。
  2. 目的是为了降低类之间的耦合性。 

如何用delegate实现解耦

delegate去处理一系列事件,就像UITextFieldDelegate一样,能监测将要开始编辑,已经开始编辑、return按钮点击等。  

delegate的使用场景: 

控件有一系列时间点,控制器可以实现这个代理方法,以便在适当的时机做适当的事。 

点击return回收键盘

实现步骤 :

    1. 将AppDelegate作为UITextField的delegate
    2. AppDelegate.h文件接受UITextFieldDelegate协议
    3. AppDelegate.m文件实现textFiledShouldReturn:方法

 

    •  1 //AppDelegate.m
      2 - (BOOL)textFieldShouldReturn:(UITextField *)textField
      3 {
      4     [textField resignFirstResponder];
      5     return YES;
      6 }

 小节:

UITextField不应该再类内部(.m)实现textFieldShouldReturn:,因为有的时候,我们点return的时候,并不总是想回收键盘。

对于一个V来说,自己只负责触发事件,事件由外界实现,即delegate。


iOS程序启动流程

 main函数是程序入口

 任何一个程序,无论是基于Mac OS还是iOS,程序都是从main.m文件的main函数开始执行的。

1 int main(int argc, char * argv[]) {
2     @autoreleasepool {
3         return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
4     }
5 }
 UIApplicationMain

UIApplicationMain在程序入口函数main函数中调用,主要实现了三个功能:

    1. 创建应用程序(UIApplication)实例
    2. 创建应用程序代理实例
    3. 建立事件循环(runloop:死循环,不断检测程序运行状态,是否被触摸、晃动等) 

 

UIApplicationMain剖析:

int UIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName);

    1. principalClassName:应用程序对象的类名(UIApplication或其子类)
    2. delegateClassName:应用程序delegate的类名。(任何接受了UIApplicationDelegate的类) 

 

 UIApplicationMain根据上述两个类名创建应用程序实例、应用程序代理实例。然后建立事件循环(runloop),检测程序的各种事件(程序开始启动,接收到触摸等)

 应用程序代理
    • 应用程序代理,主要检测应用程序的状态并作出相应的处理。
    • 应用程序的状态有很多,比如:程序启动、进入活跃状态、进入到后台、内存警告、收到远程消息等
    • 任何接受了UIApplicationDelegate协议的对象都可以成为应用程序代理。
    • 一旦应用程序的某种状态触发,就会执行相应的代理方法。 
 UIApplicationDelegate

UIApplicationDelegate是一个OC协议。里面声明了一堆方法,这些方法都与应用程序运行状态有关,它们由应用程序代理实现。UIApplication对象负责调用。 

1 //告诉delegate程序启动即将完成,程序准备要运行。(delegate实现这个方法时,要创建window对象,将程序内容通过window呈现给用户)
2 application:didFinishLaunchingWithOptions:
3 //告诉delegate应用程序已经进入活跃状态(重新执行被暂停的任务
4 applicationDidBecomeActive:
5 //告诉delegate程序即将进入非活跃状态(暂停游戏,停止timer等)applicationWillResignActive:
6 //告诉delegate程序已经进入到了后台(存储用户数据、释放一些公共资源,停止timer等)
7 applicationDidEnterBackground:
8 //告诉delegate应用程序即将进入前台(取消所有进入后台时暂停的任务applicationWillEnterForeground:  

 

 

 1 //AppDelegate文件下各方法的用法:(应用程序挂起、复原与终止):
 2 //首次运行:
 3 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
 4 //=====> 程序首次运行
 5 - (void)applicationDidBecomeActive:(UIApplication *)application
 6 //===> 程序重新激活 !
 7  
 8 //首次关闭(home):
 9 - (void)applicationWillResignActive:(UIApplication *)application
10 //===> 程序将挂起 !
11 - (void)applicationDidEnterBackground:(UIApplication *)application
12 //===> 程序进入后台 !
13  
14 //再次运行:
15 - (void)applicationWillEnterForeground:(UIApplication *)application
16 //===> 程序进入前台 !
17 - (void)applicationDidBecomeActive:(UIApplication *)application
18 //===> 程序重新激活 !
19  
20 //再次关闭:
21 - (void)applicationWillResignActive:(UIApplication *)application
22 //===> 程序将挂起 !
23 - (void)applicationDidEnterBackground:(UIApplication *)application
24 //===> 程序进入后台 !
25 
26 //终止程序:
27 - (void)applicationWillTerminate:(UIApplication*)application
28 //===> 程序将终止 ! 

 

 

 

 

 

 

 

posted @ 2015-04-08 20:59  captivity  阅读(110)  评论(0)    收藏  举报