UI_设计模式_Delegate
什么是delegate模式
- 当一个类的某些功能需要被别人来实现,但是既不明确是些什么功能,又不明确谁来实现这些功能的时候,就要使用委托模式。
- 目的是为了降低类之间的耦合性。
如何用delegate实现解耦
delegate去处理一系列事件,就像UITextFieldDelegate一样,能监测将要开始编辑,已经开始编辑、return按钮点击等。
delegate的使用场景:
控件有一系列时间点,控制器可以实现这个代理方法,以便在适当的时机做适当的事。
点击return回收键盘
实现步骤 :
- 将AppDelegate作为UITextField的delegate
- AppDelegate.h文件接受UITextFieldDelegate协议
- AppDelegate.m文件实现textFiledShouldReturn:方法
- 1 //AppDelegate.m
2 - (BOOL)textFieldShouldReturn:(UITextField *)textField
3 {
4 [textField resignFirstResponder];
5 return YES;
6 }
main函数是程序入口小节:
UITextField不应该再类内部(.m)实现textFieldShouldReturn:,因为有的时候,我们点return的时候,并不总是想回收键盘。
对于一个V来说,自己只负责触发事件,事件由外界实现,即delegate。
iOS程序启动流程
UIApplicationMain任何一个程序,无论是基于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函数中调用,主要实现了三个功能:
- 创建应用程序(UIApplication)实例
- 创建应用程序代理实例
- 建立事件循环(runloop:死循环,不断检测程序运行状态,是否被触摸、晃动等)
应用程序代理int UIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName);
- principalClassName:应用程序对象的类名(UIApplication或其子类)
- delegateClassName:应用程序delegate的类名。(任何接受了UIApplicationDelegate的类)
UIApplicationMain根据上述两个类名创建应用程序实例、应用程序代理实例。然后建立事件循环(runloop),检测程序的各种事件(程序开始启动,接收到触摸等)
- 应用程序代理,主要检测应用程序的状态并作出相应的处理。
- 应用程序的状态有很多,比如:程序启动、进入活跃状态、进入到后台、内存警告、收到远程消息等
- 任何接受了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 //===> 程序将终止 !

浙公网安备 33010602011771号