iOS开发之设计模式(一)
2015-12-22 12:49
363 查看
从本篇文章开始,我们将陆续讲解iOS开发中使用到的几种主要的设计模式。本篇文章就简单介绍委托设计模式。
简单理解一下委托模式:就是对象A想要做的操作交给对象B去做,其中对象B就是委托对象。也叫做对象A的代理
不是任何对象都能成为对象A的代理。一个对象要想成为对象A的代理是有条件的,就是要遵循对象A的协议(类似Java接口),遵循协议后还要实现协议中的方法。
对委托模式的理解可为下图:
下面我们来通过一个例子:点击HXRedView上的按钮greenButton,在控制器页面中打印内容。
HXRedView.h
HXRedView.m
ViewController.m
运行结果:
点击按钮后:
在ViewController.m文件中,创建了HXRedView对象redView之后,设置了redView的代理为控制器
但是并不是所有对象都能成为redView的代理,控制器要遵循redView的协议才行
现在代理就可以实现协议中的方法。
Objective-C的协议,类似于C++的抽象类,JAVA的接口。其具体定义如下:
@protocol为协议关键字,HXRedViewDelegate为协议名,didClickGreenButton为协议里的方法。
委托模式就介绍到这里。
简单理解一下委托模式:就是对象A想要做的操作交给对象B去做,其中对象B就是委托对象。也叫做对象A的代理
不是任何对象都能成为对象A的代理。一个对象要想成为对象A的代理是有条件的,就是要遵循对象A的协议(类似Java接口),遵循协议后还要实现协议中的方法。
对委托模式的理解可为下图:
下面我们来通过一个例子:点击HXRedView上的按钮greenButton,在控制器页面中打印内容。
HXRedView.h
#import <UIKit/UIKit.h> @<span style="color:#FF0000;">protocol</span> HXRedViewDelegate <NSObject> @optional - (void)didClickGreenButton; @end @interface HXRedView : UIView /** * 代理(委托对象) */ <span style="color:#FF0000;">@property (nonatomic, weak) id<HXRedViewDelegate> delegate;</span> @end
HXRedView.m
#import "HXRedView.h" @interface HXRedView () @property (nonatomic, weak) UIButton *greenButton; @end @implementation HXRedView - (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { self.backgroundColor = [UIColor redColor]; // 创建按钮 UIButton *greenButton = [[UIButton alloc] init]; [greenButton setTitle:@"绿色按钮" forState:UIControlStateNormal]; [greenButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; [greenButton setBackgroundColor:[UIColor greenColor]]; [greenButton addTarget:self action:@selector(clickGreenButton) forControlEvents:UIControlEventTouchUpInside]; [self addSubview:greenButton]; self.greenButton = greenButton; } return self; } /** * 点击按钮的监听方法 */ - (void)clickGreenButton { // 通知代理 if (<span style="color:#FF0000;">[self.delegate respondsToSelector:@selector(didClickGreenButton)]</span>) {// 代理对象实现了协议 <span style="color:#FF0000;">[self.delegate didClickGreenButton];</span> } } /** * 布局子控件尺寸和位置 */ - (void)layoutSubviews { [super layoutSubviews]; self.greenButton.frame = CGRectMake(50, 50, 200, 80); } @end
ViewController.m
#import "ViewController.h" #import "HXRedView.h" @interface ViewController ()<span style="color:#FF0000;"><HXRedViewDelegate></span> @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // 创建HXRedView对象 HXRedView *redView = [[HXRedView alloc] initWithFrame:CGRectMake(10, 64, 300, 200)]; // 将redView的代理设置为控制器 <span style="color:#FF0000;"> redView.delegate = self;</span> [self.view addSubview:redView]; } /** * 代理(自己)实现协议方法 */ - (void)didClickGreenButton { NSLog(@"代理%@实现了协议", self); } @end
运行结果:
点击按钮后:
在ViewController.m文件中,创建了HXRedView对象redView之后,设置了redView的代理为控制器
redView.delegate = self;
但是并不是所有对象都能成为redView的代理,控制器要遵循redView的协议才行
@interface ViewController ()<HXRedViewDelegate>
现在代理就可以实现协议中的方法。
Objective-C的协议,类似于C++的抽象类,JAVA的接口。其具体定义如下:
@protocol HXRedViewDelegate<NSObject> @optional - (void)didClickGreenButton; @end
@protocol为协议关键字,HXRedViewDelegate为协议名,didClickGreenButton为协议里的方法。
委托模式就介绍到这里。
相关文章推荐
- ios runtime 动态注册一个新类 增加一个方法
- iOS MagicRecord 详解
- iOS 项目的目录结构能看出你的开发经验
- iOS 学会使用delegate和block<一>
- iOS去掉html 的转义符号
- iOS实现图片高斯模糊
- iOS怎么获取设置是否开启消息通知
- iOS邮件
- iOS中把tableviewcell设置成圆角
- iOS开发 如何使用Leak检查内存泄漏
- IOS版添加phonegap-银联支付插件教程
- iOS26 AFNetworking
- 深入理解Grand Central Dispatch (GCD)(一)
- iOS开发系列--数据存取
- iOS开发系列--地图与定位
- iOS验证手机号的正则表达式
- iOS开发系列--通知与消息机制
- iOS开发系列--音频播放、录音、视频播放、拍照、视频录制
- iOS开发系列--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开发汇总
- 如何把关联性的告警智能添加到 Nagios 上?(2)