0x00 前言
本文基于文末参考
-推荐阅读
文章中的实际应用举例
-1.模仿 AOP 拦截
0x01 场景
想象一下
你的控制器的View
上只有一个button
标题是抽奖
button
绑定的事件是抽奖
button ---> 抽奖
这个button
只做一件事:抽奖!
0x02 需求
现在需求改变了
需要在抽奖
前判断一下是否有资格?
所以现在逻辑变了
button ---> 是否有资格 ---> 抽奖
这个很简单!
在抽奖
逻辑前
再加上是否有资格
的逻辑
OK,搞定!
0x03 更进一步
需求再变化一下
button ---> 是否有资格 ---> 是否已抽过奖 ---> 给个弹框提示要消耗多少金币 ---> 抽奖
这样一来
button
绑定的事件方法内
由原来由简单的抽奖
逻辑
增加了其他各种各样地判断逻辑
如果这个button
是你自定义的
在其他地方使用时
只需要抽奖
那么就多了很多无用的逻辑
一个真正想要抽奖
的button
做了很多不相关的事情
单一职责原则
没有在这个button
上体现出来
0x04 如何处理
基于文末参考
-推荐阅读
文章中的实际应用举例
-1.模仿 AOP 拦截
的思路
在button
添加一个单击手势
- UITapGestureRecognizer
其属性之一:
@property(nonatomic) BOOL cancelsTouchesInView;
// default is YES. causes touchesCancelled:withEvent: or pressesCancelled:withEvent: to be sent to the view for all touches or presses recognized as part of this gesture immediately before the action method is called.
当手势
与button事件
都有时
因为手势
的cancelsTouchesInView
是 YES
所以会导致button事件
失效
也就是button
绑定的方法没有被调用
当手势
的cancelsTouchesInView
是 NO
时
button事件
才会被调用
0x05 具体方法
添加手势:
[button addGestureRecognizer:({
[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction:)]
})];
处理逻辑:
- (void)tapAction:(UIGestureRecognizer *)gesture
{
UIButton *button = (UIButton *)gesture.view;
// 1.判断是否有资格?
// 2.是否已抽过奖
// 3.给个弹框提示要消耗多少金币
// 如果条件都符合,那么设置
gesture.cancelsTouchesInView = NO;
// 继续执行button事件方法
// 如果有弹框提示等
[self alertTips:@"一些提示" callback:^(BOOL flag){
if (flag) {
// 这里要直接调用button方法了,因为这里是异步回调,点击事件早就走远了
[weakSelf clickAction:button];
}
}];
}
0x06 最后
赠送一句口诀:
实践是检验真理的唯一标准
最后
方法clickAction:
内还有一步操作
实践会告诉你是什么了。
0x07 意外
(2019-8-6)
手指在按钮上滑动,或者滑出按钮frame
外后,抬起手指
点击
手势,居然没有被识别?!
而是直接走的,按钮对应方法
。
那岂不是所有判断,都直接跳过了!!
这不是很尴尬😓
在按钮clickAction:
方法内添加必要判断
- (void)clickAction:(UIButton *)button
{
// 获取按钮上的手势
UIGestureRecognizer *gesture = button.gestureRecognizers[0];
// 判断为YES,则说明没有调用手势对应方法
if (gesture.cancelsTouchesInView == YES) {
[self tapAction:gesture];
return;
}
// 此处还有一步需要设置,就是(自己实践)
// xxx
}
参考
推荐阅读:
https://mp.weixin.qq.com/s/5ZV0eUljDYY36qaq0KzrUA
https://www.jianshu.com/p/9e6c9a42eb94
Use Control With Block Without Weak-Strong Dance
https://github.com/xjh093/JHUIControlBlock
轻轻松松给文本添加点击事件
https://github.com/xjh093/JHTapTextView