编程

当前位置:永利皇宫463登录 > 编程 > 重新点击难题,的再一次点击间隔

重新点击难题,的再一次点击间隔

来源:http://www.makebuLuo.com 作者:永利皇宫463登录 时间:2019-09-12 14:29

原稿地址:

如何是那个主题材料

参照链接:

前日无意看到个很科学的小技术,怕忘记,记录下。

笔者们的开关是点击一遍响应二回, 固然反复的点击也不会出标题, 可是有个别场景下还偏偏就是会出难题.

http://www.cocoachina.com/ios/20150911/13260.html

神蹟大家不希望顾客疯狂的点击有个别按键,比方点击开关发网络乞请的地方,大概因为网络原因,点击三次开关木有乞请到数量,那时候客户恐怕自己疯狂地方击开关(是自己,明确这么干

平凡是如何减轻

主题素材陈诉:

    • !),那样很轻松出标题。 那时候大家可以安装双入眼击开关的间隔时间:

小编们平常会在按键点击的时候设置那些按键不可点击. 等待0.xS的延时后,在装置回来; 大概在操作截止的时候设置能够点击.

      我们的开关是点击贰次响应贰回, 尽管频频的点击也不会出标题, 不过某个场景下还偏偏就是会出难题.

① 新建个持续自 UIButton 的分类, .h文件扩展五个属性

- (IBAction)clickBtn1:(UIbutton *)sender

平时是什么样缓慢解决

@property(nonatomic,assign)NSTimeInterval repeatClickTime;

@property(nonatomic,assign,readonly)NSTimeInterval lx_acceptedEventTime;

{

大家普通会在按键点击的时候设置那几个按键不可点击. 等待0.xS的延时后,在装置回来; 只怕在操作甘休的时候设置能够点击.

② 因为是分类,想要在外界能够援引就必要runtime 来申明下 .m文件 方法

sender.enabled = NO;


#import <objc/runtime.h>

static const void *repeatClickTimeKey = &repeatClickTimeKey;

static const void *lx_acceptedEventTimeKey = &lx_acceptedEventTimeKey;

@implementationUIButton (RepeatClick)

- (NSTimeInterval)repeatClickTime

{

return[objc_getAssociatedObject(self,repeatClickTimeKey) doubleValue];

}

- setRepeatClickTime:(NSTimeInterval)repeatClickTime

{

objc_setAssociatedObject(self,repeatClickTimeKey,@(repeatClickTime),OBJC_ASSOCIATION_RETAIN_NONATOMIC);

}

- (NSTimeInterval)lx_acceptedEventTime

{

return[objc_getAssociatedObject(self,lx_acceptedEventTimeKey)doubleValue];

}

- setLx_acceptedEventTime:(NSTimeInterval)lx_acceptedEventTime

{

objc_setAssociatedObject(self,lx_acceptedEventTimeKey,@(lx_acceptedEventTime),OBJC_ASSOCIATION_RETAIN_NONATOMIC);

}

doSomething

- (IBAction)clickBtn1:(UIbutton *)sender

③ 过滤按键点击事件

sender.enabled = YES;

{

+load

{

Methoda =class_getInstanceMethod(self,@selector(sendAction:to:forEvent:));

Methodb =class_getInstanceMethod(self,@selector(__lx_sendAction:to:forEvent:));

method_exchangeImplementations;

}

- __lx_sendAction:action to:target forEvent:event

{

if(NSDate.date.timeIntervalSince1970-self.lx_acceptedEventTime<self.repeatClickTime) return;

if(self.repeatClickTime>0)

{

self.lx_acceptedEventTime=NSDate.date.timeIntervalSince1970;

}

[self__lx_sendAction:action to:target forEvent:event];

}

}

sender.enabled = NO;

假若涉及到开关不一样意况不相同体裁的时候, 用enabled不见得够用.还得极其加个变量来记录状态.

doSomething

- (IBAction)clickBtn1:(UIbutton *)sender

sender.enabled = YES;

{

}


若果波及到按键不一致情况区别体制的时候, 用enabled不见得够用.还得额外加个变量来记录状态.


if(doingSomeThing)return;

- (IBAction)clickBtn1:(UIbutton *)sender

doingSomeThing = YES;

{

doSomething

if (doingSomeThing) return;

doingSomeThing = NO;

doingSomeThing = YES;

}

doSomething

小编举的事例是平素在响应事件的周期内平素禁止点击的. 假如想做1秒内禁止重复点击的话,则得用performSelector:withObject:afterDelay:

doingSomeThing = NO;

杰出的消除是何等的

}


地点的事例是平昔在响应事件的周期内直接禁止点击的. 若是想做1秒内不准重复点击的话,则得用performSelector:withObject:afterDelay:


美好的消除是何等的

有了再也的代码段就是有了三个共性, 就能够抽象出来.

咱俩得以给按钮加多叁个性质重复点击间隔, 通过安装这几个特性来调控再一次接受点击事件的时日间隔.


有了重复的代码段正是有了八个共性, 就能够抽象出来.

@interface UIControl (XY)

大家得以给开关增多壹天性子重复点击间隔, 通过安装这性子格来调节再一次接受点击事件的时间间隔.

@property (nonatomic, assign) NSTimeInterval uxy_acceptEventInterval;  // 能够用这一个给重新点击加间隔

@interface UIControl (XY)

@end

@property (nonatomic, assign) NSTimeInterval uxy_acceptEventInterval;// 可以用那个给重新点击加间隔

static const char *UIControl_acceptEventInterval = "UIControl_acceptEventInterval";

@end

- (NSTimeInterval)uxy_acceptEventInterval

static const char *UIControl_acceptEventInterval ="UIControl_acceptEventInterval";

{

- (NSTimeInterval)uxy_acceptEventInterval

return [objc_getAssociatedObject(self, UIControl_acceptEventInterval) doubleValue];

{

}

return[objc_getAssociatedObject(self, UIControl_acceptEventInterval) doubleValue];

- (void)setUxy_acceptEventInterval:(NSTimeInterval)uxy_acceptEventInterval

}

{

- (void)setUxy_acceptEventInterval:(NSTimeInterval)uxy_acceptEventInterval

objc_setAssociatedObject(self, UIControl_acceptEventInterval, @(uxy_acceptEventInterval), OBJC_ASSOCIATION_RETAIN_NONATOMIC);

{

}


在app运行的时候,大家hook 全数的开关的 event


objc_setAssociatedObject(self, UIControl_acceptEventInterval, @(uxy_acceptEventInterval), OBJC_ASSOCIATION_RETAIN_NONATOMIC);

@implementation UIControl (XY)

}

+ (void)load

在app运行的时候,大家hook 全部的按键的 event

{

@implementation UIControl (XY)

Method a = class_getInstanceMethod(self, @selector(sendAction:to:forEvent:));

+ (void)load

Method b = class_getInstanceMethod(self, @selector(__uxy_sendAction:to:forEvent:));

{

method_exchangeImplementations(a, b);

Method a = class_getInstanceMethod(self, @selector(sendAction:to:forEvent:));

}

Method b = class_getInstanceMethod(self, @selector(__uxy_sendAction:to:forEvent:));

@end


在大家的点击事件里吧,对点击事件做下过滤


method_exchangeImplementations(a, b);

- (void)__uxy_sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event

}

{

@end

if (self.uxy_ignoreEvent) return;

在大家的点击事件里呢,对点击事件做下过滤

if (self.uxy_acceptEventInterval > 0)

- (void)__uxy_sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event

{

{

self.uxy_ignoreEvent = YES;

if(self.uxy_ignoreEvent)return;

[self performSelector:@selector(setUxy_ignoreEvent:) withObject:@(NO) afterDelay:self.uxy_acceptEventInterval];

if(self.uxy_acceptEventInterval > 0)

}


事实上使用起来就是那么些样子


{

self.uxy_ignoreEvent = YES;

UIButton *tempBtn = [UIButton buttonWithType:UIButtonTypeCustom];

[self performSelector:@selector(setUxy_ignoreEvent:) withObject:@(NO) afterDelay:self.uxy_acceptEventInterval];

[tempBtn addTarget:self action:@selector(clickWithInterval:) forControlEvents:UIControlEventTouchUpInside];

}

tempBtn.uxy_acceptEventInterval = 0.5;


固然如此不引入大规模用runtime, 可是小范围内使用大概得以缓和广大小意思的.

[self __uxy_sendAction:action to:target forEvent:event];

}

其实利用起来正是以此样子

UIButton *tempBtn = [UIButton buttonWithType:UIButtonTypeCustom];

[tempBtn addTarget:self action:@selector(clickWithInterval:) forControlEvents:UIControlEventTouchUpInside];

tempBtn.uxy_acceptEventInterval = 0.5;

小说至此就停止了.就算不推荐大规模用runtime, 然而小范围Nelly用依然得以化解好些个小标题标.

转载 --

本文由永利皇宫463登录发布于编程,转载请注明出处:重新点击难题,的再一次点击间隔

关键词:

上一篇:没有了

下一篇:没有了