一般的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];
自定义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 。