学IOS大半年了,终于理顺了代理的思路。
看别人的讲解一直都没有理解好,和我自己的思维逻辑不符合。对于不理解有什么实际用处的东西总是学不好,现在终于理解了一些。
现在和大家分享一个小Demo。
问题:通过根视图控制器的子视图上的按钮点击来改变整个视图控制器的背景颜色。
点击前:
点击后:
效果大家看到了,子视图上的按钮,如何改变根视图控制器的视图背景颜色的呢,这里就要用到代理。
把按钮按下的消息,发送给根视图控制器,来改变视图背景颜色。
代码如下:
gifView.h(继承UIView)中代码如下:
#import <UIKit/UIKit.h>
@protocol changColor <NSObject>
- (void)DoChangColor;
@end
@interface GifView : UIView
{
id <changColor> delegate;
}
@property (nonatomic, retain) id <changColor> delegate;
@end
gifView.m中代码如下:
@implementation GifView
@synthesize delegate;
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self)
{
UIButton *button=[UIButton buttonWithType:UIButtonTypeSystem];
button.backgroundColor=[UIColor redColor];
button.frame=CGRectMake(50, 50, 200, 100);
[button addTarget:self action:@selector(play) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:button];
}
return self;
}
-(void)play
{
[delegate DoChangColor];
}
@end
创建根视图RootViewController,代码如下:
RootViewController.m中代码如下:
@implementation RootViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
self.view.backgroundColor=[UIColor orangeColor];
GifView *tmp = [[GifView alloc] initWithFrame:[UIScreen mainScreen].bounds];
tmp.delegate = self;
[self.view addSubview:tmp];
}
- (void)DoChangColor
{
self.view.backgroundColor=[UIColor grayColor];
}
@end
希望通过这个Demo可以让初学者更好的理解代理。