昨天做了一个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
@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];
}
- ({
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!");
}
- ({
[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的每次执行了。
相关推荐
最近收集的VB.Net-C#多线程Thread-代理委托delegate编程。文章列表: c#.net多线程同步.txt C#WebBrowser页面与WinForm交互技巧一.txt C#多线程编程-多细全.txt C#多线程编程简单实例.txt C#多线程窗体控件安全访问....
本文实例讲述了C#使用委托(delegate)实现在两个form之间传递数据的方法。分享给大家供大家参考。具体分析如下: 关于Delegate【代理、委托】是C#中一个非常重要的概念,向前可以推演到C++的指针,向后可以延续到匿名...
网上有很多关于C++ delegate机制的文章,但都讲的是函数指针的内容,上周就C++中实现C#的delegate机制的问题研究了好几天,查看了很多相关资料,才解决了问题,现将我写的C++ delegate测试程序贴出来,希望能帮到有...
delegate_execute.exe
对iOS的delegate代理方式不是很清楚的同学可以来看看,很简单的代码,看过之后应该给你有帮助
本例子演示了iPhone开发中最常用到的两个类之间互相通信的方法之一:delegate
delegate、五步曲、调用照相机、切换键盘
ios设计模式delegate 示例 ,导航功能的两个视图控制器(用push方式从一个窗口推到另一个窗口),第二个窗口创建两个按钮,标题分别为红色和绿色,点相应的按钮弹回前一个窗口,同时前一个窗口的背影色变成按钮标题...
delegate进行GameObject之间的通信.pdf
网上也有很多Delegate的Demo,比较乱,感觉不容易看懂。本来一个很简单的问题,大家搞得这么复杂。这个Demo就通俗易懂、简单、实用
delegate和block是iOS上常用于实现回调的两种机制,Demo将两者进行了简单的归类与对比。
oc中以delegate实现页面间的传值过程
iOS 的delegate代码是http://blog.csdn.net/ilikeprograming/article/details/26206075的附件。这份代码有助于新手理解delegate。
完整工程代码,看完了你的QT View/Model 和 delegate就算入门了。
在qt的MVC模式中,运用控件在delegate中显示的方法。
CSharp_Delegate C#委托 本人博客中的示例代码
delegate与block的使用
C# delegate thread范例 若不懂在代码中,线程如何调用的可以看看
适合初学者了解C#的delegate,是一个非常简单的例子。
delegate和block的使用