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中的三种回调模式:目标动作回调,委托回调 ...
- 微信企业号开发(1)WebAPI在回调模式中的URL验证
微信回调模式的官方文档. 开发语言:C#(微信相关功能代码可以从官网下载) 首先,必须要明确几个参数,这几个参数在微信企业号中,每次调用都会使用到. 1.msg_signature:签名(已加密,加密 ...
- .net之微信企业号开发(三) 回调模式的接口开发
一.前言 微信企业号应用中,有两种模式,一种是普通模式,这种模式只能进行简单网页链接,以及发送固定的消息.为了可以让企业号的用户更好的与应用交互,微信提供了回调模式,这种回调模式的可以将用户发送给微信 ...
- 用c#开发微信(1)服务号的服务器配置和企业号的回调模式 - url接入 (源码下载)
最近研究了下服务号的服务器配置和企业号的回调模式.真正实现完后,觉得很简单,但一开始还是走了点弯路,所以写了个web程序,只用改下配置文件里的参数就可以直接用了.下面介绍下详细的用法以及实现步骤. 本 ...
- Asp.net中的ajax回调模式(ICallbackEventHandler)
客户端回调本质上就是指通过前端的客户端脚本向服务器端传递相应的数据参数,服务器端再以接受到的参数进行查询和处理,最后将结果回传到客户端进行显示.asp.net 2.0提供了实现无刷新回调的接口ICal ...
- AFHTTPClient的异步回调模式
以前第一个版本,ios的http都用的同步模式,在很多地方会导致线程阻塞,自己开发了一个简易的AFHTTPClient的异步回调模式. 回调的protocol: @protocol MyAFNetwo ...
- rpyc 回调模式工作不正常
rpyc 回调模式工作不正常 最近使用了 rpyc 来处理一个多节点间的文件同步的任务,目标是使用 rpyc 来实现简单的 p2p 文件传输机制,以减少单点负载和单点失败对传输的影响. 和 p2p 的 ...
- JavaScript学习笔记(十二) 回调模式(Callback Pattern)
函数就是对象,所以他们可以作为一个参数传递给其它函数: 当你将introduceBugs()作为一个参数传递给writeCode(),然后在某个时间点,writeCode()有可能执行(调用)intr ...
- 如何用php开启企业微信开发的回调模式
猜想: 懵逼 实践: 微信公众号开发的手册中甚至给出了只需要修改几个参数就能使用的范例.企业微信开发中在一个很不显眼的地方放了一个sample. https://work.weixin.qq.com/ ...
随机推荐
- MAC下使用Charles抓取安卓模拟器数据
一.安装Charles,这个不多记录 二.Charles数据乱码问题(参照这篇文章 http://blog.csdn.net/huanghanqian/article/details/52973651 ...
- DSY2748*音量调节
Description 一个吉他手准备参加一场演出.他不喜欢在演出时始终使用同一个音量,所以他决定每一首歌之前他都要改变一次音量.在演出开始之前,他已经做好了一个列表,里面写着在每首歌开始之前他想要改 ...
- sqlmap用户手册 | WooYun知识库
sqlmap用户手册 说明:本文为转载,对原文中一些明显的拼写错误进行修正,并标注对自己有用的信息. 原文:http://drops.wooyun.org/tips/143 ============ ...
- System.Web.HttpContext.Current.Session为NULL解决方法
http://www.cnblogs.com/tianguook/archive/2010/09/27/1836988.html 自定义 HTTP 处理程序,从IHttpHandler继承,在写Sys ...
- MVC自定义分页(附表跳转页Loading提示)
之前我发表了一篇MVC无刷新分页的文章,里面用的是MvcPager控件,但是那个受那个控件限制,传值只能用PagedList,各方面都受到了限制,自由度不够高,现在还是做MVC无刷新分页,但是想直接用 ...
- CSS基础篇之了解CSS和它的基本属性
CSS是什么? CSS英文全名是Cascading Style Sheets翻译过来就是层叠样式表,它主是把网页表现与内容分离的一种样式设计语言.这种语言能优化我们编程,把东西简化和优化写法,而且不同 ...
- 在 IIS 7.5 中,应用程序池有两种运行模式:集成模式和经典模式。
应用程序池模式会影响服务器处理托管代码请求的方式. 如果托管应用程序在采用集成模式的应用程序池中运行,服务器将使用 IIS 和 ASP.NET 的集成请求处理管道来处理请求. 如果托管应用程序在采用经 ...
- [转]runtime 消息机制
原文地址:http://www.jianshu.com/p/f6300eb3ec3d 一.关于runtime 之前在项目中有遇到过用runtime解决改变全局字体的问题,所以再一次感受到了runtim ...
- 解读ASP.NET 5 & MVC6系列(1):ASP.NET 5简介
ASP.NET 5简介 ASP.NET 5是一个跨时代的改写,所有的功能和模块都进行了独立拆分,做到了彻底解耦.为了这些改写,微软也是蛮 拼的,几乎把.NET Framwrok全部改写了一遍,形成了一 ...
- .Net开发笔记(十九) 创建一个可以可视化设计的对象
阅读本篇博客之前需要了解VS窗体设计器的工作原理,详细可参见本系列博客(十).(十一).(十二).必须需要知道的一条结论就是:处于窗体设计器(Form Designer)中的任何组件(包含控件,下同) ...