UI阶段 protocol/delegate设计模式

问题:我怎么实现通过点击,一个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.让代理去干活(让代理去调用协议中的方法)
**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值