UI阶段 protocol/delegate设计模式

来源:互联网 发布:银行卡数据采集器 编辑:程序博客网 时间:2024/04/27 16:46

问题:我怎么实现通过点击,一个UIImageView的对象,实现相应的操作,这里以更换图片为例

思路二:仿照UIButton的target/action设计模式 (思路一请参阅上一篇)(参考UITextFieldDelegate设计)
(MFC 手动管理内存)

// 协议可以单独创建,也可以在类中创建
这里就在类中创建
首先还是声明一个ButtonImageView的类
创建一个协议

ButtonImageView.h

#import <UIKit/UIKit.h>@class ButtonImageView;@protocol ButtonImageViewDelegate <NSObject>//  方法 捕获点击事件- (void)buttonImageViewClick:(ButtonImageView *)btnImgView;@end@interface ButtonImageView : UIImageView//  设置代理属性  代理得是遵守协议对象,注意此次代理是用assign//  为了防止循环引用,造成内存泄露@property (nonatomic,assign)id <ButtonImageViewDelegate>delegate;@end

ButtonImageView.m

#import "ButtonImageView.h"@implementation ButtonImageView//  由于你需要点击,之后有相关的操作//  重写touches的相关方法- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{}- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event{}- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{    //  让代理去干活    //  当代理去调用代理方法    //  代理保护    if ([_delegate respondsToSelector:@selector(buttonImageViewClick:)]) {        [_delegate buttonImageViewClick:self];    }}- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{}

RootViewController.h

#import <UIKit/UIKit.h>#import "ButtonImageView.h"@interface RootViewController : UIViewController<ButtonImageViewDelegate>@end

RootViewController.m

#import "RootViewController.h"#import "ButtonImageView.h"@interface RootViewController ()@end@implementation RootViewController- (void)viewDidLoad {    [super viewDidLoad];    // Do any additional setup after loading the view.    UIImage *img = [UIImage imageNamed:@"5.jpg"];    ButtonImageView *btnImageView = [[ButtonImageView alloc]initWithFrame:[UIScreen mainScreen].bounds];    btnImageView.image = img;    //  设置代理    btnImageView.delegate = self;    //  打开交互    btnImageView.userInteractionEnabled = YES;    [self.view addSubview:btnImageView];     [btnImageView release];}- (void)didReceiveMemoryWarning {    [super didReceiveMemoryWarning];    // Dispose of any resources that can be recreated.}//  实现协议中的方法//  不管是Target/Action设计模式 还是代理设计模式 还是MVC 设计模式 中心只有一个 节耦(降低类和类之间的耦合性) 提高代码的复用性- (void)buttonImageViewClick:(ButtonImageView *)btnImgView{    //  更换头像    UIImage *img1 = [UIImage imageNamed:@"6.jpeg"];    btnImgView.image = img1;}@end

windows设置根视图的代码和思路一一致,也是最基本的步骤一致.
** 小结:
这里先简单介绍一些协议的步骤:
1.创建协议(协议名字,协议的方法)
2.遵守协议(谁遵守谁实现)
3.实现协议中的方法(谁遵守谁实现)
4.添加代理对象为实例变量(谁需要代理 就在那个类里声明实例变量的属性,而且还必须是遵守协议的实例变量的属性)
5.设置代理
6.让代理去干活(让代理去调用协议中的方法)
**

0 0