代理和协议的语法这里不赘述,自己查资料。
这个demo的思路是这样的,有一个A类,这个类不是一个基于视图类,它继承自NSObject,这个类会启动一个定时器,当定时器触发时,它会触发B视图弹出一个alert提醒。因为A类没法直接操作B视图,所以它用委托机制,“委托”B视图来操作。
新建一个view的工程,名为DelegateDemo,默认生成的这个视图就是我们的B视图。然后新建一个timeControl类,作为我们的A类。
A类的头文件先要定义一个协议,这个我们的代理要遵循的协议,然后应该还有一个公共的方法,用来启动定时器,代码如下:
- #import <Foundation/Foundation.h>
-
-
-
- @protocol UpdateAlertDelegate <NSObject>
- - (void)updateAlert;
- @end
-
-
- @interface TimerControl : NSObject
-
- @property (nonatomic, weak) id<UpdateAlertDelegate> delegate;
-
- - (void) startTheTimer;
-
- @end
然后我们看看A类的实现文件,非常简单,启动定时器,定时器触发就通过代理对象更新视图:
- @implementation TimerControl
-
-
- - (void) startTheTimer
- {
-
- [NSTimer scheduledTimerWithTimeInterval:5.0f target:self selector:@selector(timerProc) userInfo:nil repeats:NO];
- }
-
- - (void) timerProc
- {
- [self.delegate updateAlert];
- }
-
- @end
再来看看视图类,它首先要遵循上面定义的协议,才能”帮助”A类来处理事情,如下:
- #import <UIKit/UIKit.h>
- #import "TimerControl.h"
-
- @interface DelegateDemoViewController : UIViewController<UpdateAlertDelegate>
-
- @end
很明显,协议在这里就像中间人的作用,没有这个中间人,就无法”受理代理”。注意代理和协议并不是总要一起实现,只是大部分情况下我们会用协议来辅助实现代理。B视图的实现文件也很简单:
- - (void)viewDidLoad
- {
- [super viewDidLoad];
-
- TimerControl *timer = [[TimerControl alloc] init];
- timer.delegate = self;
- [timer startTheTimer];
- }
-
- - (void)didReceiveMemoryWarning
- {
- [super didReceiveMemoryWarning];
-
- }
-
-
- - (void)updateAlert
- {
- UIAlertView *alert=[[UIAlertView alloc] initWithTitle:@"提示" message:@"时间到" delegate:self cancelButtonTitle:nil otherButtonTitles:@"确定",nil];
-
- alert.alertViewStyle=UIAlertViewStyleDefault;
- [alert show];
- }