delegate
昨天做了一个demo,用到了简单代理。 delegate是ios编程的一种设计模式。我们可以用这个设计模式来让单继承的objective-c类表现出它父类之外类的特征。昨天这个代理实现如下:
类GifView是继承自UIView的,它加载在RootViewController上来通过一个Timer播放动画。同时,RootViewController需要知道Timer的每次执行。 代码如下。 首先,定义GifView,在其头文件中定义代理EveryFrameDelegate,同时声明方法- (void)DoSomethingEveryFrame;
#import <UIKit/UIKit.h>
@protocol EveryFrameDelegate <NSObject> - ( void)DoSomethingEveryFrame; @end @interface GifView : UIView { NSTimer *timer; id <EveryFrameDelegate> delegate; NSInteger currentIndex; } @property (nonatomic, retain) id <EveryFrameDelegate> delegate; @end 然后,只要在GifView.m中让Timer在每次执行的时候调用delegate来执行DoSomethingEveryFrame,代码如下
id)initWithFrame:(CGRect)frame
- (
{ self = [super initWithFrame:frame]; if (self) { timer = [NSTimer scheduledTimerWithTimeInterval: 0.05 target:self selector:@selector(play) userInfo:nil repeats:YES]; [timer fire]; } return self; } -( void)play { [ delegate DoSomethingEveryFrame]; } GifView上的工作就完成了。 下面是RootViewController中的代码,RootViewController只要在定义GifView的时候指定其代理为自身,就可以知道Timer的每次执行:
void)viewDidLoad
- (
{ [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. CGRect rect = CGRectMake( 0, 0, 200, 200); GifView *tmp = [[GifView alloc] initWithFrame:rect]; tmp. delegate = self; [self.view addSubview:tmp]; [tmp release]; } - ( void)DoSomethingEveryFrame { NSLog( @" I'm the delegate! I'm doing printing! "); } GifView中Timer每次执行都会打印一行 I'm the delegate! I'm doing printing! 故,RootViewController就知道Timer的每次执行了。 |