UIButton 触发多个事件 响应同一函数

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 。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值