您的位置:首页 > 其它

代理---代理---代理(这也把问题说清楚了,不过某些命名不是很规范)

2015-11-03 14:21 337 查看
 转载请注明出处
http://blog.csdn.net/pony_maggie/article/details/25655443
作者:小马

代理和协议的语法这里不赘述,自己查资料。

 

这个demo的思路是这样的,有一个A类,这个类不是一个基于视图类,它继承自NSObject,这个类会启动一个定时器,当定时器触发时,它会触发B视图弹出一个alert提醒。因为A类没法直接操作B视图,所以它用委托机制,“委托”B视图来操作。

 

新建一个view的工程,名为DelegateDemo,默认生成的这个视图就是我们的B视图。然后新建一个timeControl类,作为我们的A类。

 

A类的头文件先要定义一个协议,这个我们的代理要遵循的协议,然后应该还有一个公共的方法,用来启动定时器,代码如下:

 

[objc] view
plaincopy





#import <Foundation/Foundation.h>  

  

  

//协议定义  

@protocol UpdateAlertDelegate <NSObject>  

- (void)updateAlert;  

@end  

  

  

@interface TimerControl : NSObject  

//遵循协议的一个代理变量定义  

@property (nonatomic, weak) id<UpdateAlertDelegate> delegate;  

  

- (void) startTheTimer;  

     

@end  

然后我们看看A类的实现文件,非常简单,启动定时器,定时器触发就通过代理对象更新视图:

[objc] view
plaincopy





@implementation TimerControl  

  

  

- (void) startTheTimer  

{  

  

    [NSTimer scheduledTimerWithTimeInterval:5.0f target:self selector:@selector(timerProc) userInfo:nil repeats:NO];  

}  

  

- (void) timerProc  

{  

    [self.delegate updateAlert];//代理更新UI  

}  

  

@end  

再来看看视图类,它首先要遵循上面定义的协议,才能”帮助”A类来处理事情,如下:

[objc] view
plaincopy





#import <UIKit/UIKit.h>  

#import "TimerControl.h"  

  

@interface DelegateDemoViewController : UIViewController<UpdateAlertDelegate>  

  

@end  

很明显,协议在这里就像中间人的作用,没有这个中间人,就无法”受理代理”。注意代理和协议并不是总要一起实现,只是大部分情况下我们会用协议来辅助实现代理。B视图的实现文件也很简单: 

 

[objc] view
plaincopy





- (void)viewDidLoad  

{  

    [super viewDidLoad];  

    // Do any additional setup after loading the view, typically from a nib.  

    TimerControl *timer = [[TimerControl alloc] init];  

    timer.delegate = self; //设置代理实例  

    [timer startTheTimer];//启动定时器,定时5触发  

}  

  

- (void)didReceiveMemoryWarning  

{  

    [super didReceiveMemoryWarning];  

    // Dispose of any resources that can be recreated.  

}  

  

//"被代理对象"实现协议声明的方法,由"代理对象"调用  

- (void)updateAlert  

{  

    UIAlertView *alert=[[UIAlertView alloc] initWithTitle:@"提示" message:@"时间到" delegate:self cancelButtonTitle:nil otherButtonTitles:@"确定",nil];  

      

    alert.alertViewStyle=UIAlertViewStyleDefault;  

    [alert show];  

}  

 

源码下载地址:
https://github.com/pony-maggie/DelegateDemo
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: