Target-Action回调模式
前面的博客中提到过回调的概念,是在OC通过协议来实现的回调,和Java中的接口的回调极为相似,下面来介绍另一种方法回调模式: Target-Action回调。首先我们来从字面意思来理解一下Target-Action回调模式,Target目标即我们要调用哪个目标对象中的方法。Action是行为的意思,就是我们要调用目标对象中的哪一个方法。委托回调模式之前在Java中接触过,而Target-Action回调模式笔者是第一次接触,可能是笔者道行太浅,感觉这是OC中对回调的新用法,感觉还行,不难理解。
还是那句话,废话少说,用代码说问题最为直接了。下面代码是笔者根据自己的理解写的的测试demo,不足之处还请批评指正,转载或者引用请注明出处。
在做测试的Project中,我们需要用到一个Controler和两个组件ComponentOne和ComponentTwo。为了体现出Target-Action回调模式,我们需要在组件中通过Target-Action回调模式来回调Controler中每个组件所对应的方法。为实现在组件中的回调,我们需要Controler在组件中进行注册,不然就找不到target对象和回调的方法啦。
为了作对比,在组件1中回调的方法是不带参数的,而在组件2中回调的方法是带参数的。可能到这读者看来上面的内容感觉有点抽象,看代码来的最为直接,代码走起~
1.首先我们先编写我们的组件1,在组件1中回调的Controler方法是不带参数的
组件1中的接口:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
//
// ComponentOne.h
//
#import <Foundation/Foundation.h>
@interface ComponentOne : NSObject
//记录target和action的属性
@property (nonatomic, strong) id target;
@property (nonatomic, assign) SEL action;
//声明目标动作注册方法
-( void ) addTarget : (id)target Action : (SEL)action;
//组件一的启用方法
-( void ) start;
@end
|
组件1的实现:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
//
// ComponentOne.m
//
#import "ComponentOne.h"
@implementation ComponentOne
//实现组件中的注册方法
-( void )addTarget:(id)target Action:(SEL)action
{
self.target = target;
self.action = action;
}
//实现组件的启动方法
-( void )start
{
//回调target对象中的action方法
[self.target performSelector:_action];
}
@end
|
代码说明:
1.属性target用于接收Controler的对象,也就是要回调的目标对象。
2.属性action用于接收目标对象的方法,也就是要在目标对象中要回调的方法
3.addTarget: Action:方法用于注册目标动作,说白了目标对象和目标对象的方法是通过这个方法传入到组件中的
4.start函数负责回调目标对象中的方法
2.组件1完事以后我们就开始编写我们的组件2啦,组件2和组件1中唯一不同的地方是回调的方法需要组件2提供参数,下面就只给出不同的部分代码:
1
2
3
4
5
|
//组件二的启动方法
-( void )start
{
[self.target performSelector:self.action withObject:@ "*组件二中返回的参数*" ];
}
|
代码说明: 在回调Controler方法的时候,需要组件2提供参数,然后再回调
3.组件写好了,接下来我们就开始装配了,下面我们就开始编写我们的Controler方法,来完成组装任务,并且给每个组件提供相应的回调方法。在每个回调方法中就开始编写我们的业务逻辑,同时也可以根据组件提供的参数来实现我们的特定业务逻辑。下面就是我们的Controler的实现部分。
装配时为了隐藏我们的组件,我们在实现文件中用延展来装配我们的组件,假定在Controler中要使用我们的组件1、2,Controler中的代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
#import "Controler.h"
#import "ComponentOne.h"
#import "ComponentTwo.h"
//在Controler中使用ComponentOne组件和ComponentTow组件
//为了隐藏Controler内部组件,我们用延展进行组件的声明和调用
@interface Controler ()
//声明组件
@property(nonatomic, strong) ComponentOne *oneComponent;
@property(nonatomic, strong) ComponentTwo *twoComponent;
//声明Controler中的方法,用于组件的回调
//声明组件一中回调的方法,无惨方法
-( void )componentOneFunction;
//声明组件二中的回调方法,有参方法
-( void )componentTwoFunction : (NSString *)strValue;
@end
//-----------------------实现部分---------------------------
@implementation Controler
//进行组件的初始化并注册回调方法
- (instancetype)init
{
self = [super init];
if (self) {
//给组件一分配内存空间
self.oneComponent = [[ComponentOne alloc] init];
//注册组件一的回调方法
[self.oneComponent addTarget:self Action:@selector(componentOneFunction)];
//启动组件一
[self.oneComponent start];
//给组件二分配内存空间
self.twoComponent = [[ComponentTwo alloc] init];
//注册组件二的回调方法
[self.twoComponent addTarget:self Action:@selector(componentTwoFunction:)];
//启动组件二
[self.twoComponent start];
}
return self;
}
//实现controler中的回调方法
-( void )componentOneFunction
{
NSLog(@ "我是Controler中的componentOneFunction方法,我是在组件一中回调使用的" );
}
-( void )componentTwoFunction:(NSString *)strValue
{
NSLog(@ "我是Controler中的componenTwoFunction方法,我的参数%@是从组件二中回调时获取的" , strValue);
}
@end
|
代码说明:
1.在Controler中我们声明并实例化了我们要使用的组件模块
2.在Controler中声明和实现组件中Controler对象要回调的方法
3.在组件实例化后我们要再组件中注册我们要调用Controler中的那个方法。
4.注册后,我们就可以启动组件来测试组件功能
4,在mian函数中我们为了测试,把Controler进行实例化,代码如下:
1
2
|
//controler的实现
Controler *controler = [[Controler alloc] init];
|
上面代码的运行结果如下:
1
2
|
2014-08-18 08:33:23.900 Test2[544:303] 我是Controler中的componentOneFunction方法,我是在组件一中回调使用的
2014-08-18 08:33:23.902 Test2[544:303] 我是Controler中的componenTwoFunction方法,我的参数*组件二中返回的参数*是从组件二中回调时获取的
|
上面所有的代码是笔者根据个人理解Target-Action回调模式来设计的样例,因水平有限,避免有偏颇之处。希望大家批评指正,还是那句话,如需转载请注明出处。
Target-Action回调模式相关推荐
- IOS开发之自定义Button(集成三种回调模式)
前面在做东西的时候都用到了storyboard,在今天的代码中就纯手写代码自己用封装个Button.这个Button继承于UIView类,在封装的时候用上啦OC中的三种回调模式:目标动作回调,委托回调 ...
- 【JUC系列】Future异步回调模式
何为异步回调 前面只是一个例子,对并发的主要模式进行形象的说明. 下面正式来讲下经常使用的几个和并发相关的概念. 1.2.1. 同步.异步.阻塞.非阻塞 一:同步 所谓同步,就是在发出一个功能调用时, ...
- UI一揽子计划 5 (Target: Action: 、Protocol Delegate、 UIImageView 、手势识别器)
一.target/ action 设计模式 耦合是衡量⼀一个程序写的好坏的标准之一, 耦合是衡量模块与模块之间关联程度的指标 "高内聚,低耦合"是⾯面 ...
- java 回调模式_总结!!!总结!!!java回调以及future模式
总是忘记,我这里直接写实际的东西,看其他的博客都是类图,文字描述,这里直接用代码描述. 疑问:什么是回调 回调,回调.要先有调用,才有调用者和被调用者之间的回调.所以在百度百科中是这样的: 软件模块之 ...
- 用c#开发微信(1)服务号的服务器配置和企业号的回调模式 - url接入
2019独角兽企业重金招聘Python工程师标准>>> 阅读目录 一.用法 二.实现方法 最近研究了下服务号的服务器配置和企业号的回调模式.真正实现完后,觉得很简单,但一开始还是走了 ...
- python企业微信回调_python 微信企业号-回调模式接收微信端客户端发送消息并被动返回消息...
说明:此代码用于接收手机微信端发送的消息 #-*- coding:utf-8 -*- from flask import Flask,request from WXBizMsgCrypt import ...
- java企业号回调模式,微信公众平台企业号开发—开启回调模式
2014年9月17日,微信发布了期待已久的企业号.网上关于企业号的教程几乎还是0,所以这里分享一下的我的开发经验. 对比于订阅号和服务号的开发,企业号的开发显得更加复杂一点.这大概也是腾讯考虑到企业信 ...
- 微信企业号开发:启用回调模式
微信企业号开发怎样启用回调模式?就是简单的登陆PC版微信,点击应用中心,选择须要应用,再点击回调模式启用? 似乎不是这么简单.! 能够看到核心的仅仅有三个URL.Token,EncodingAESKe ...
- python企业微信回调_回调模式
回调模式 在回调模式下,企业不仅可以主动调用企业号接口,还可以接收成员的消息或事件.接收的信息使用XML数据格式.UTF8编码,并以AES方式加密. 企业号的每个应用都有自己的回调模式开关.在管理端开 ...
最新文章
- Buttomsheetdialog的简单实用
- 黑科技抗疫,Python开发者大集结!
- java 文件 缓冲区大小_Java web 中文件下载遇到的缓冲大小问题
- using namspace std的使用
- python安装cv-oracle时如何解决vc++的问题_python中cx_Oracle模块安装遇到的问题与解决方法...
- c# list排序的三种实现方式 (转帖)
- 深入理解Java:注解(Annotation)--注解处理器
- HTML DOM之属性的各种操作方法
- air英语怎么读_如何用英语发音“Macbook Air”
- 18 | 理论四:接口隔离原则有哪三种应用?原则中的“接口”该如何理解?
- c++ 覆盖、重载与隐藏
- 并发编程学习之阻塞队列ArrayBlockingQueue
- 使用QT简单写一个串口助手
- iphone换android手机铃声,在iPhone中换个自定义铃声的11个步骤
- 修改程序的图标与详细描述
- 服务器ldb文件可以删除,Access数据库锁死,出现.ldb文件解决办法
- 营业执照识别/发票识别在供应链与物流智能移动解决方案
- 一种隐私保护边云协同训练
- html 图片鼠标移上去点亮,CSS3 实现鼠标移到图片上时一片亮光一闪而过的效果...
- excel中在公式中实现单元格内换行
热门文章
- oracle查询表的意思,Oracle表的查询(一)
- 将python程序打包成可执行文件exe
- [Ext JS6]多类型设备开发
- c语言输入字符串做四则运算,C++字符串四则运算实例讲解
- phpstorm xdebug本地调试断点不生效_PHPSTORM与xdebug配置
- linux设备驱动 注册 命令6,Linux设备驱动程序学习----6.模块的参数
- 计算机三级嵌入式系统考试之矩阵键盘
- Linux下的whoami命令
- python dict遍历性能_python 字典(dict)遍历的四种方法性能测试报告
- 机器学习什么显卡_为什么要学习机器人编程?