ios委托(由传对象实例引入委托详解)

来源:互联网 发布:冠唐软件 编辑:程序博客网 时间:2024/05/22 14:34

我们先不讲委托,先用一个类似委托的例子来引入委托,这样会更好理解一些!

首先,我创建一个工程,叫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];}

然后完美实现此功能,即点击按钮,让控制器的背景颜色随机改变!

———-分割线,引入委托

0 0