IOS开发之Target-Action模式
该模式主要是为了减少模块之间代码耦合性,以及增强模块内代码之间的内聚性.
让我们来看看一个实例:
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模式相关推荐
- (0105)iOS开发之iOS13 暗黑模式(Dark Mode)适配
导读: Material Design & iOS 13 黑暗模式总结探索 暗黑模式苹果开发文档 如何不进行系统切换样式的适配 注意 同一工程内多个Assets文件在打包后,就会生成一个Ass ...
- iOS开发之iOS13 暗黑模式(Dark Mode)适配
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/shifang07/article/de ...
- 李洪强iOS开发之RunLoop的原理和核心机制
李洪强iOS开发之RunLoop的原理和核心机制 搞iOS之后一直没有深入研究过RunLoop,非常的惭愧.刚好前一阵子负责性能优化项目,需要利用RunLoop做性能优化和性能检测,趁着这个机会深入研 ...
- iOS开发之Xcode常用调试技巧总结
转载自:iOS开发之Xcode常用调试技巧总结 最近在面试,面试过程中问到了一些Xcode常用的调试技巧问题.平常开发过程中用的还挺顺手的,但你要突然让我说,确实一脸懵逼.Debug的技巧很多,比如最 ...
- iOS开发之ARC(自动引用计数)
iOS开发之ARC(自动引用计数) 英文原文:Automatic Reference Counting on iOS 参与翻译(4人): 纶巾客, showme, 李远超, 王宇龙 自动引用计数(AR ...
- (0045) iOS 开发之MBProgressHUD 源码学习
(0045) iOS 开发之MBProgressHUD 源码学习 第一部分:学习所得和分析线程 1. 学习到了kvo 的使用 和屏幕方向的旋转判断. 2. 如果调起这个 HUD 的方法不是在主线程调 ...
- 图片轮播c语言,IOS开发之UIScrollView实现图片轮播器的无限滚动
IOS开发之UIScrollView实现图片轮播器的无限滚动 简介 在现在的一些App中常常见到图片轮播器,一般用于展示广告.新闻等数据,在iOS内并没有现成的控件直接实现这种功能,但是通过UIScr ...
- iOS开发之UI开发(UITableView)
UITableView 继承自UIScrollView,性能极佳 UITableView的两种样式 UITableViewStylePlain列表样式 UITableViewStyleGrouped ...
- iOS开发之AVKit框架使用
2019独角兽企业重金招聘Python工程师标准>>> iOS开发之AVKit框架使用 一.引言 在iOS开发框架中,AVKit是一个非常上层,偏应用的框架,它是基于AVFounda ...
- (0016)iOS 开发之Mac上Navicat Premium 创建远程连接和本地连接
1.下载安装 (百度云盘里面有安装文件和注册机) 链接: https://pan.baidu.com/s/1kVG1k71 密码: mr5g 破解教程看这篇博客:http://blog.csdn.ne ...
最新文章
- 联盟链赛道上,微众、蚂蚁、百度、京东等“正规军”能崛起吗?
- Qmake变量variable
- PIL Image resize 调整大小谜之操作
- 基于事件驱动架构构建微服务第7部分:在仓储上实现事件溯源
- azure 部署java_jClarity:在Azure上升级到Java
- vue前后分离session实现_vue2 前后端分离项目ajax跨域session问题解决
- 飞鸽传书2011绿色版使用简介
- 在 F5 LTM 上配置数据包过滤
- [spring]用IEDA创建spring boot项目
- html点击按钮 重新加载页面或者跳转页面实现
- 算法学习笔记(八) 动态规划的一般求解方法
- java核心技术 第11版 集合
- 实战项目 仿写小米商城 网页框架
- DLL的远程注入技术及注入dll函数调用
- 微信授权就是这个原理,Spring Cloud OAuth2 授权码模式
- CTF misc图片类总结(入门级)
- mtcnn人脸检测中将ckpt训练模型转换为 npy保存
- pyltp的基本用法和语义角色标注
- 炉石传说的代码是Java吗,hearthstone: 炉石传说,JAVA模拟器(HearthStone Simulator for Java)...
- (附源码)springboot电商系统前端界面设计与浏览器兼容性研究 毕业设计 231058