搜索
您的当前位置:首页正文

iOS 代理

来源:二三娱乐

转载请注明出处

作者:小马

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

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

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

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

#import 

//协议定义

@protocolUpdateAlertDelegate 

- (void)updateAlert;

@end

@interfaceTimerControl : NSObject

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

@property(nonatomic, weak)id delegate;

- (void) startTheTimer;

@end

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

@implementationTimerControl

- (void) startTheTimer

{

[NSTimerscheduledTimerWithTimeInterval:5.0ftarget:selfselector:@selector(timerProc)userInfo:nilrepeats:NO];

}

- (void) timerProc

{

[self.delegateupdateAlert];//代理更新UI

}

@end

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

#import 

#import "TimerControl.h"

@interfaceDelegateDemoViewController : UIViewController

@end

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

- (void)viewDidLoad

{

[superviewDidLoad];

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

TimerControl*timer = [[TimerControlalloc]init];

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

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

}

- (void)didReceiveMemoryWarning

{

[superdidReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

}

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

- (void)updateAlert

{

UIAlertView*alert=[[UIAlertViewalloc]initWithTitle:@"提示"message:@"时间到"delegate:selfcancelButtonTitle:nilotherButtonTitles:@"确定",nil];

alert.alertViewStyle=UIAlertViewStyleDefault;

[alertshow];

}

Top