我们先不讲委托,先用一个类似委托的例子来引入委托,这样会更好理解一些!
首先,我创建一个工程,叫Delegate,然后创建一个控制器叫ZQTestViewController,再创建一个类叫MyView,此类继承UIView.
然后先把ZQTestViewController放到window上,代码
ZQTestViewController *vi = [[ZQTestViewController alloc]init];
self.window.rootViewController = vi;
然后在MyView.m文件中把它的初始化方法initWithFrame重写,在其上加一个按钮,代码:
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
UIButton *btn = [UIButton buttonWithType:UIButtonTypeSystem];
CGPoint point = CGPointMake(self.frame.size.width/2, self.frame.size.height/2);
//CGPoint point = CGPointMake(0,0);
btn.bounds = CGRectMake(0, 0, 50, 50);
btn.center = point;
[btn addTarget:self action:@selector(doSome:) forControlEvents:UIControlEventTouchUpInside];
btn.backgroundColor = [UIColor grayColor];
[self addSubview:btn];
//NSLog(@"%f",self.frame.origin.x/2);
//[btn bringSubviewToFront:self];
}
return self;
}
然后在控制器的viewDidLoad中创建MyView对象,把其对象放到控制器上.代码:
- (void)viewDidLoad
{
[super viewDidLoad];
MyView *view = [[MyView alloc]initWithFrame:CGRectMake(0, 0, 160, 240)];
//view.bounds = CGRectMake(0, 0, 160, 240);
view.center = self.view.center;
view.backgroundColor = [UIColor greenColor];
[self.view addSubview:view];
}
现在运行模拟器,显示效果如下
———-华丽的分割线
现在来讲我们要实现的功能,首先,我想在点击按钮的时候,然后控制器的背景改成随机颜色,
此时在MyView中要给按钮添加事件,代码
- (void)doSome:(UIButton *)btn{
}
然后此时我把改变控制器的颜色的方法(changeBackground)写在控制器中,想让MyView的按钮事件调用changeBackground方法.
此时问题就来了!MyView的对象根本不能调用控制器中的changeBackground方法.他们唯一的关系就是MyView放在了控制器上而已.怎么办呢?
此时我们要让MyView和控制器发生关系了,方法是:
在MyView中添加一个属性,此属性的类型是控制器类型的,然后在控制器中创建MyView对象的时候,让MyView的控制器属性赋值控制器,代码实现如下:
这个是MyView.h文件
#import <UIKit/UIKit.h>
#import "ZQTestViewController.h"
@interface MyView : UIView
@property (nonatomic,retain)ZQTestViewController *zhuRen;
@end
控制器的viewDidLoad方法代码以及改变颜色的代码:
- (void)viewDidLoad
{
[super viewDidLoad];
MyView *view = [[MyView alloc]initWithFrame:CGRectMake(0, 0, 160, 240)];
//view.bounds = CGRectMake(0, 0, 160, 240);
view.center = self.view.center;
view.zhuren = self;//因为此方法是控制器调用的,所以self是控制器,让MyView的控制器属性赋值控制器
view.backgroundColor = [UIColor greenColor];
[self.view addSubview:view];
}
- (void)changeBackground{
self.view.backgroundColor = [UIColor colorWithRed:arc4random()%256/255.0 green:arc4random()%256/255.0 blue:arc4random()%256/255.0 alpha:1];
}
然后让MyView的中的按钮调用changeBackground方法.代码:
- (void)doSome:(UIButton *)btn{
[self.zhuRen changeBackground];
}
然后完美实现此功能,即点击按钮,让控制器的背景颜色随机改变!