Target - action(目标 - 行为)模式,我的理解就是给我们创建的某个控件或视图或者自定义控件添加一个像按钮(Button)那样的监测响应方法,来实现与用户的交互.
例如iOS中的UIView能够接收到触摸事件,但是默认是对触摸事件不做处理的,如果你想让视图做出处理,就必须要自定义一个视图(继承自UIView).那么我们通过一个简单的小例子,来了解下什么是Target - action设计模式,假如现在我们有需求如下:
1.屏幕上的红色视图 ---点击改变自身颜色
2.屏幕上的绿色视图 -- 点击改变父类颜色
3.屏幕上的蓝色视图 -- 点击改变自身大小
初学的时候,会想到用三个自定义视图,来分别实现点击时,三个视图分别做出不同的效果.这样的做的话,太麻烦了.那么有没有一种只需要定义一个视图,分别调用三个不同的方法,来实现点击不同视图出现的不同效果呢?接下来,我们就来新建个工程做一下.
首先,我们先新建一个工程(我用的是MRC),之后再创建一个视图控制器,创建好视图控制器后,在AppDelegate.m文件的application:didFinishLaunchingWithOptions:方法中指定为window的根视图控制器
接下来创建一个自定义视图EventView,这个视图就是用来添加方法的,从而使外部用EventView视图创建的对象,可以用自身带的方法,来响应事件的处理.
上图在EventView.m文件中加了一个EventView类的延展,里面添加了两个属性,分别用来存放响应的目标,和响应的方法.然后再视图控制器里面创建EventView视图对象-- 红色视图,绿色视图,和蓝色视图.
在视图控制器中,我们用自定义的视图EventView创建了一个红色视图对象,这个redView对象调用了EventView视图的addTarget:action:方法,这样就可以单独的对这个红色视图进行响应处理,响应处理的方法是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按钮的响应方法模式,再联系这个,他们的思想是一样的.而设计模式之所以存在,就是为了降低程序的耦合性,提高内聚性,提升程序的可修改性,可扩展性.