1v1绑定方法
UIButton利用函数:
- (void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents;
绑定事件。
一般的N v 1绑定方法
一般是每次绑定一个事件,如:UIControlEventTouchDown、UIControlEventTouchUpInside等。每个事件的响应函数一般也不同,所以大部分时候这么写:
[btn addTarget:self action:@selector(action1:) forControlEvents:UIControlEventTouchUpInside];
[btn addTarget:self action:@selector(action2:) forControlEvents:UIControlEventTouchDown];
但是,有时候,我们想要触发多个事件时执行同一操作,比如,按钮按下的时候弹框,按钮弹起时也弹框,那么一般写法是:
[btn addTarget:self action:@selector(alert:) forControlEvents:UIControlEventTouchUpInside];
[btn addTarget:self action:@selector(alert:) forControlEvents:UIControlEventTouchDown];
事件触发简单原理
UIControlEvents 类型是 NS_OPTIONS,值是一系列:1 << 0, 1 << 1, 1 << 2,1 << 3…… 假设有4个事件:A、B、C、D,它们分别对应的就是0001,0010,0100,1000。
以下述代码为例,触发A事件时,执行action操作:
[btn addTarget:self action:@selector(action:) forControlEvents:A];
程序运行中,假如触发一个事件event,后台对event和A进行与操作,如果结果非0,则执行action,否则什么都不做。如果event是A,那么A&A,肯定非0,执行action;如果是B、C、D,0001&0100、0001&0010、0001&1000结果都是0,什么都不做。
自定义UIControlEvents
当事件很多时,用一般的n v 1绑定方法就很麻烦。所以,我们可以自定义UIControlEvents。
仍以上面ABCD为例,如果想要触发A、B事件都执行action,可以将第三个参数修改为0011。这时:
A&0011 = 0001&0011 = 0001 非0;
B&0011 = 0010&0011 = 0010 非0;
C&0011 = 0100&0011 = 0000 0;
D&0011 = 1000&0011 = 0000 0。
所以当我们想按钮按下和弹起时都执行弹框操作,可以设置:
UIControlEvents event = UIControlEventTouchDown|UIControlEventTouchUpInside
[btn addTarget:self action:@selector(alert:) forControlEvents:event];
我遇到的情况是,我需要在按钮按下时执行action1,其余时候全部执行action2,所以我的代码是:
UIControlEvents event = UIControlEventAllEvents - UIControlEventTouchDown;
注意:
UIControlEvents event = !UIControlEventTouchDown;
是取非,得到的是0;按位取非是 0 - UIControlEventTouchDown 或者 ~UIControlEventTouchDown 。