轉(zhuǎn)載請(qǐng)注明出處
http://blog.csdn.net/pony_maggie/article/details/25655443
作者:小馬
代理和協(xié)議的語(yǔ)法這里不贅述萌衬,自己查資料实蔽。
這個(gè)demo的思路是這樣的,有一個(gè)A類闪唆,這個(gè)類不是一個(gè)基于視圖類,它繼承自NSObject,這個(gè)類會(huì)啟動(dòng)一個(gè)定時(shí)器饱苟,當(dāng)定時(shí)器觸發(fā)時(shí)炊邦,它會(huì)觸發(fā)B視圖彈出一個(gè)alert提醒编矾。因?yàn)锳類沒(méi)法直接操作B視圖,所以它用委托機(jī)制馁害,“委托”B視圖來(lái)操作窄俏。
新建一個(gè)view的工程,名為DelegateDemo,默認(rèn)生成的這個(gè)視圖就是我們的B視圖碘菜。然后新建一個(gè)timeControl類凹蜈,作為我們的A類。
A類的頭文件先要定義一個(gè)協(xié)議忍啸,這個(gè)我們的代理要遵循的協(xié)議仰坦,然后應(yīng)該還有一個(gè)公共的方法,用來(lái)啟動(dòng)定時(shí)器计雌,代碼如下:
[objc]view plaincopy
#import?
//協(xié)議定義
@protocolUpdateAlertDelegate?
-?(void)updateAlert;
@end
@interfaceTimerControl?:?NSObject
//遵循協(xié)議的一個(gè)代理變量定義
@property(nonatomic,?weak)id?delegate;
-?(void)?startTheTimer;
@end
然后我們看看A類的實(shí)現(xiàn)文件悄晃,非常簡(jiǎn)單,啟動(dòng)定時(shí)器白粉,定時(shí)器觸發(fā)就通過(guò)代理對(duì)象更新視圖:
[objc]view plaincopy
@implementationTimerControl
-?(void)?startTheTimer
{
[NSTimerscheduledTimerWithTimeInterval:5.0ftarget:selfselector:@selector(timerProc)userInfo:nilrepeats:NO];
}
-?(void)?timerProc
{
[self.delegateupdateAlert];//代理更新UI
}
@end
再來(lái)看看視圖類传泊,它首先要遵循上面定義的協(xié)議,才能”幫助”A類來(lái)處理事情鸭巴,如下:
[objc]view plaincopy
#import?
#import?"TimerControl.h"
@interfaceDelegateDemoViewController?:?UIViewController
@end
很明顯眷细,協(xié)議在這里就像中間人的作用,沒(méi)有這個(gè)中間人鹃祖,就無(wú)法”受理代理”溪椎。注意代理和協(xié)議并不是總要一起實(shí)現(xiàn),只是大部分情況下我們會(huì)用協(xié)議來(lái)輔助實(shí)現(xiàn)代理恬口。B視圖的實(shí)現(xiàn)文件也很簡(jiǎn)單:
[objc]view plaincopy
-?(void)viewDidLoad
{
[superviewDidLoad];
//?Do?any?additional?setup?after?loading?the?view,?typically?from?a?nib.
TimerControl*timer?=?[[TimerControlalloc]init];
timer.delegate=self;//設(shè)置代理實(shí)例
[timerstartTheTimer];//啟動(dòng)定時(shí)器校读,定時(shí)5觸發(fā)
}
-?(void)didReceiveMemoryWarning
{
[superdidReceiveMemoryWarning];
//?Dispose?of?any?resources?that?can?be?recreated.
}
//"被代理對(duì)象"實(shí)現(xiàn)協(xié)議聲明的方法,由"代理對(duì)象"調(diào)用
-?(void)updateAlert
{
UIAlertView*alert=[[UIAlertViewalloc]initWithTitle:@"提示"message:@"時(shí)間到"delegate:selfcancelButtonTitle:nilotherButtonTitles:@"確定",nil];
alert.alertViewStyle=UIAlertViewStyleDefault;
[alertshow];
}