The Target-Action Paradigm(目标-行动 样式)
视频锁定
{$ currentTime | date:'mm:ss' $}
{$ timeLeft | date:'mm:ss' $}
消息选择器(selector)的一种习惯用法被称为Target-Action Paradigm(目标-行动 样式)。这个样式提供了一种在运行时将图形用户界面上的对象和其它对象绑定到一起的方法。
如果可以给这个图形用户界上的对象指定一个目标对象以及让目标对象响应的消息(Action),那么这个图形用户界面上的对象就成为了一个灵活的信号发送者(sender)。当有某些事件发生并给图形界面上的对象一个信号(比如用户的触摸操作),这个对象就可以调用目标对象的指定方法(Action)了(或者说可以给目标对象发送指定消息了),而且图形用户界面上的对象还可以将自己作为参数一起随消息发送给指定对象(sender)。
Target-Action Paradigm(目标-行动 样式)的代码实现也非常简单。
- (id) performAction
{
if (target == nil || action == 0)
{
return nil; // 目标对象不存在或者指定消息没有被目标对象实现,则返回nil
}
if ([target respondsToSelector: action] == NO)
{
return nil; // 目标对象无法处理Action消息,返回nil
}
return [target performSelector: action withObject: self];
}
举个例子,图形界面上有一个按钮(button),当按钮被按下的时候,要执行一些代码:
[button setTarget: bigMachine];
[button setAction: @selector(startUp:)];
上面的代码,button对象将目标对象和startUp:方法存入了自己的实力变量中。当按钮被按下的事件发生后,运行时会自动给bigMachine发送@selector(startUp:)的方法,代码如下:
"[bigMachine startUp: button]";
如果你经常编写Java中与事件和监听有关的代码,在Objective-C中,大部分情况下一个事件发生时只需要通知一个对象,那么Target-Action Paradigm(目标-行动 样式)是一种更为轻量化的解决方案。相对于新建一个类或者扩展一个类,你仅仅需要将你要调用的方法在图形界面元素上做一个注册而已。当然,如果你想将某事件同时发给多个对象,那么你就需要自己动手去写一个特殊的方法了,这个做法与Java中的做法差不多,不多大多数情况下,你不会有这个需求的。
在线练习
{$ activeFileHint $}