该模式主要是为了减少模块之间代码耦合性,以及增强模块内代码之间的内聚性.

让我们来看看一个实例:

1:假设有这么一个需求:我们点击一个视图对象,可以改变该视图的颜色,这个对于初学者来说是一件非常容易做到的事,只要在这个视图类中重写:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event函数,然后改变该视图的背景色即可,可是这时候又有了新的需求,一部分人需要在点击该视图改变该视图的颜色,一部分人需要在点击该视图时改变该视图的位置,为了让不同对象执行不同的事件,在实例化该视图类对象时需要指定该对象感兴趣的事件,对于这个需求我们可以通过定义枚举变量作为该对象的数据成员,并在初始化的时候指定枚举值(即指定感兴趣的事件),同时需要重写-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event函数,让它对不同的枚举值,执行不同的功能,假设这个时候我们又需要在点击该视图对象时,执行一个翻转功能,我们得又去修改该视图内的具体实现功能,这样代码之间的耦合性就比较大,移植起来就很不方便(试想这样的一个场景,假设别人的app需要你写好的这个视图类,但是别人不需要你视图类中事件方法,则需要修改该视图类,难免发生一些错误),解决这个问题的方法就是Target-Action模式,直接看代码:

//主视图头文件

#import <UIKit/UIKit.h>@interface MainViewController : UIViewController@end

//主视图实现

#import "MainViewController.h"
#import "MyView.h"@implementation MainViewController-(id)init
{self= [super init];if (self){}return self;
}-(void)viewDidLoad
{MyView * view1 = [[MyView alloc]initWithFrame:CGRectMake(10, 20, 100, 100) andTarget:self andAction:@selector(changeColor:)];[self.view addSubview:view1];MyView * view2 = [[MyView alloc]initWithFrame:CGRectMake(10, 20, 100, 100) andTarget:self andAction:@selector(moveFrame:)];[self.view addSubview:view2];}-(void)changeColor:(UIView *)aView
{NSLog(@"buttonClick");int red = arc4random()%255;int green = arc4random()%255;int blue = arc4random()%255;aView.backgroundColor = [UIColor colorWithRed:red/255.0 green:green/255.0 blue:blue/255.0 alpha:1.0];
}
-(void)moveFrame:(UIView *)aView
{aView.frame = CGRectMake(arc4random()%320, arc4random()%480, 100, 100);
}
@end

//测试视图类头文件

#import <UIKit/UIKit.h>@interface MyView : UIView
{id _target;SEL _action;
}
-(id)initWithFrame:(CGRect)frame andTarget:(id)target andAction:(SEL)action;
@property (assign,readwrite,nonatomic)id deledate;
@end

////测试视图类实现

#import "MyView.h"
@implementation MyView-(id)initWithFrame:(CGRect)frame andTarget:(id)target andAction:(SEL)action
{self = [super initWithFrame:frame];if (self){_target = target;_action = action;}self.backgroundColor = [UIColor blueColor];return self;
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{[_target performSelector:_action withObject:self];
}
@end

总结:从上面的代码中可以看出模块与模块之间的耦合性很低,无论想要添加什么功能事件,都不需要修改视图类!

转载于:https://blog.51cto.com/8947509/1575847

IOS开发之Target-Action模式相关推荐

  1. (0105)iOS开发之iOS13 暗黑模式(Dark Mode)适配

    导读: Material Design & iOS 13 黑暗模式总结探索 暗黑模式苹果开发文档 如何不进行系统切换样式的适配 注意 同一工程内多个Assets文件在打包后,就会生成一个Ass ...

  2. iOS开发之iOS13 暗黑模式(Dark Mode)适配

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/shifang07/article/de ...

  3. 李洪强iOS开发之RunLoop的原理和核心机制

    李洪强iOS开发之RunLoop的原理和核心机制 搞iOS之后一直没有深入研究过RunLoop,非常的惭愧.刚好前一阵子负责性能优化项目,需要利用RunLoop做性能优化和性能检测,趁着这个机会深入研 ...

  4. iOS开发之Xcode常用调试技巧总结

    转载自:iOS开发之Xcode常用调试技巧总结 最近在面试,面试过程中问到了一些Xcode常用的调试技巧问题.平常开发过程中用的还挺顺手的,但你要突然让我说,确实一脸懵逼.Debug的技巧很多,比如最 ...

  5. iOS开发之ARC(自动引用计数)

    iOS开发之ARC(自动引用计数) 英文原文:Automatic Reference Counting on iOS 参与翻译(4人): 纶巾客, showme, 李远超, 王宇龙 自动引用计数(AR ...

  6. (0045) iOS 开发之MBProgressHUD 源码学习

    (0045) iOS 开发之MBProgressHUD 源码学习 第一部分:学习所得和分析线程 1.  学习到了kvo 的使用 和屏幕方向的旋转判断. 2. 如果调起这个 HUD 的方法不是在主线程调 ...

  7. 图片轮播c语言,IOS开发之UIScrollView实现图片轮播器的无限滚动

    IOS开发之UIScrollView实现图片轮播器的无限滚动 简介 在现在的一些App中常常见到图片轮播器,一般用于展示广告.新闻等数据,在iOS内并没有现成的控件直接实现这种功能,但是通过UIScr ...

  8. iOS开发之UI开发(UITableView)

    UITableView 继承自UIScrollView,性能极佳 UITableView的两种样式 UITableViewStylePlain列表样式 UITableViewStyleGrouped ...

  9. iOS开发之AVKit框架使用

    2019独角兽企业重金招聘Python工程师标准>>> iOS开发之AVKit框架使用 一.引言 在iOS开发框架中,AVKit是一个非常上层,偏应用的框架,它是基于AVFounda ...

  10. (0016)iOS 开发之Mac上Navicat Premium 创建远程连接和本地连接

    1.下载安装 (百度云盘里面有安装文件和注册机) 链接: https://pan.baidu.com/s/1kVG1k71 密码: mr5g 破解教程看这篇博客:http://blog.csdn.ne ...

最新文章

  1. 联盟链赛道上,微众、蚂蚁、百度、京东等“正规军”能崛起吗?
  2. Qmake变量variable
  3. PIL Image resize 调整大小谜之操作
  4. 基于事件驱动架构构建微服务第7部分:在仓储上实现事件溯源
  5. azure 部署java_jClarity:在Azure上升级到Java
  6. vue前后分离session实现_vue2 前后端分离项目ajax跨域session问题解决
  7. 飞鸽传书2011绿色版使用简介
  8. 在 F5 LTM 上配置数据包过滤
  9. [spring]用IEDA创建spring boot项目
  10. html点击按钮 重新加载页面或者跳转页面实现
  11. 算法学习笔记(八) 动态规划的一般求解方法
  12. java核心技术 第11版 集合
  13. 实战项目 仿写小米商城 网页框架
  14. DLL的远程注入技术及注入dll函数调用
  15. 微信授权就是这个原理,Spring Cloud OAuth2 授权码模式
  16. CTF misc图片类总结(入门级)
  17. mtcnn人脸检测中将ckpt训练模型转换为 npy保存
  18. pyltp的基本用法和语义角色标注
  19. 炉石传说的代码是Java吗,hearthstone: 炉石传说,JAVA模拟器(HearthStone Simulator for Java)...
  20. (附源码)springboot电商系统前端界面设计与浏览器兼容性研究 毕业设计 231058

热门文章

  1. C#如何获取物理网卡,虚拟网卡,以及无线网卡
  2. CSS:标签右对齐,文本框左对齐的实现
  3. JAVA Web开发MySQL数据库记录浏览分页
  4. Spring入门(三)
  5. javaWEB总结(29):理解多个Filter代码的执行顺序
  6. SQL Server 触发器触发器
  7. MySQL 常用基础命令
  8. 544B. Sea and Islands
  9. C#远程连接Oracle数据库(不安装客户端)
  10. 集合类接口和类层次关系图