代理---代理---代理(这也把问题说清楚了,不过某些命名不是很规范)
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
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
相关文章推荐
- Nand flash uboot 命令详解
- git 免登录 文件
- Hadoop之客户端读取HDFS中的数据
- 浅谈海量DB的备份设计
- Ubuntu(64bit)搭建Android测试环境
- [FLUME-2052]Spooling directory source should be able to replace or ignore malformed characters
- GetDC()没有释放造成的后果
- Unity中简单 UI 管理类 - UIManager
- Elasticsearch、Logstash、Kibana搭建统一日志分析平台
- HTML5--之大话设计测试
- 输入内容到指定文本中,并打开文件
- 安卓开发学习之015 ImageView(一)基础属性详解
- 5+ App开发入门指南
- C++Primer第五版 12.1.3节练习
- 系统设计与实践
- Android 开发 --Unable to resolve target 'android-19'
- 设计模式-观察者模式
- itorch notebook上遇到的常见问题及其解决方案(一)
- iOS objc_msgSend 报错解决方案
- 积跬步,聚小流------用smartpaginator来做分页