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