美文网首页带我飞IOS开发iOS 开发随笔
iOS中的Target - action设计模式

iOS中的Target - action设计模式

作者: 三木成森 | 来源:发表于2015-09-03 22:49 被阅读1064次

    Target - action(目标 - 行为)模式,我的理解就是给我们创建的某个控件或视图或者自定义控件添加一个像按钮(Button)那样的监测响应方法,来实现与用户的交互.

    例如iOS中的UIView能够接收到触摸事件,但是默认是对触摸事件不做处理的,如果你想让视图做出处理,就必须要自定义一个视图(继承自UIView).那么我们通过一个简单的小例子,来了解下什么是Target - action设计模式,假如现在我们有需求如下:

    1.屏幕上的红色视图 ---点击改变自身颜色

    2.屏幕上的绿色视图 -- 点击改变父类颜色

    3.屏幕上的蓝色视图 -- 点击改变自身大小

    初学的时候,会想到用三个自定义视图,来分别实现点击时,三个视图分别做出不同的效果.这样的做的话,太麻烦了.那么有没有一种只需要定义一个视图,分别调用三个不同的方法,来实现点击不同视图出现的不同效果呢?接下来,我们就来新建个工程做一下.

    首先,我们先新建一个工程(我用的是MRC),之后再创建一个视图控制器,创建好视图控制器后,在AppDelegate.m文件的application:didFinishLaunchingWithOptions:方法中指定为window的根视图控制器

    指定为window的根视图控制器

    接下来创建一个自定义视图EventView,这个视图就是用来添加方法的,从而使外部用EventView视图创建的对象,可以用自身带的方法,来响应事件的处理.

    EventView.h文件 EventView.m中实现代码

    上图在EventView.m文件中加了一个EventView类的延展,里面添加了两个属性,分别用来存放响应的目标,和响应的方法.然后再视图控制器里面创建EventView视图对象-- 红色视图,绿色视图,和蓝色视图.

    本图只写了红色视图,剩下两个视图代码基本一致

    在视图控制器中,我们用自定义的视图EventView创建了一个红色视图对象,这个redView对象调用了EventView视图的addTarget:action:方法,这样就可以单独的对这个红色视图进行响应处理,响应处理的方法是handleRedView:

    handleRedView内部实现

    由于我们改变颜色是随机颜色,这样我们需要写一个UIColor类的扩展,添加一个+号方法,来实现颜色的随机.

    随机颜色的实现

    这样整体写完了,我们来理一理这个中间的过程到底是怎么回事,首先,我们在视图控制器中创建一个EventView对象redView,因为当我们点击时要改变自身的颜色,因此,它需要调用EventView里面的addTarget:action:方法,当我们点击屏幕上的红色视图时,调用EventView视图类的addTarget:action方法,方法调用完后,里面_target存放的响应目标是视图控制器,_action存放的方法就为handleRedView:,因为是触摸事件,我们将执行EventView里面的- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;这个方法,让响应目标Target执行对应的action方法,最后,我们就回到了视图控制器中执行handleRedView:方法.

    效果图

    你想象一下Button按钮的响应方法模式,再联系这个,他们的思想是一样的.而设计模式之所以存在,就是为了降低程序的耦合性,提高内聚性,提升程序的可修改性,可扩展性.

    相关文章

      网友评论

      • 7136a1c01300:新手入门啊,那个import “IUColor+Addition.h"是自定义文件吗?
      • 英俊神武:有demo地址吗,这样看起来更直接一点。
      • 平原河流:这种只能同时响应一个target或者action,能响应多个的吗?
      • 不懂后悔:请教下,下面的两个实现也是通过自定义两个方法来改变属性对吧。那touchBegan方法怎么实现三个view对应调用不同方法呢?谢谢。
        三木成森:@不懂后悔 @不懂后悔 是啊,需要再定义两个EventView视图,分别添加addTarget方法,在action里的方法中实现剩下的两个功能即可.
      • _笑口常开:这个我自己能不能实验一下呢?我在想明天自己动手操作一下,练习
        三木成森:@小小瑞 可以啊,如果真的自己做不出来,我给代码发你,加油

      本文标题:iOS中的Target - action设计模式

      本文链接:https://www.haomeiwen.com/subject/jhmlcttx.html