php重复点击按钮无效,完美解决UIButton按钮重复点击、多次响应的问题
最近測試老跑過來提bug,說按鈕可以點好幾次,然后蹦出來好幾個一樣的界面出來,解決了一個地方,其他地方也會冒出一樣的問題來,仔細一想,還是要從根本上解決問題,于是想了幾個方法:
1.添加UIButton分類,重寫-(BOOL)isTouchInside方法,讓按鈕在點擊了一次之后的0.2s(可設置)之內變成不可點擊狀態
#import "UIButton+BK.h"
@implementation UIButton (BK)
-(BOOL)isTouchInside
{
self.enabled = NO;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
self.enabled = YES;
});
return YES;
}
@end
這種做法很簡單粗暴,而且親測有效,唯一的缺點就是在按鈕點擊之后的0.2s內按鈕狀態是不可點擊狀態的(灰色),雖說0.2s很短,但是追求極致體驗的程序員肯定不會允許這種情況發生對吧 : ) 于是想到了另外一種方法
2.還是添加UIButton分類,利用runtime運行時機制,讓按鈕點擊之后的短時間內不再響應此事件,廢話不多說,show me the code
//
// UIButton+BK.h
// BMKP
//
// Created by 演員新之助 on 16/9/5.
// Copyright ? 2016年 Bmkp. All rights reserved.
//
#import
#define defaultInterval 0.5//默認時間間隔
@interface UIButton (BK)
@property(nonatomic,assign)NSTimeInterval timeInterval;//用這個給重復點擊加間隔
@property(nonatomic,assign)BOOL isIgnoreEvent;//YES不允許點擊NO允許點擊
@end
---------------------------我是可愛的分割線--------------------------
//
// UIButton+BK.m
// BMKP
//
// Created by 演員新之助 on 16/9/5.
// Copyright ? 2016年 Bmkp. All rights reserved.
//
#import "UIButton+BK.h"
@implementation UIButton (BK)
-(BOOL)isTouchInside
{
// self.enabled = NO;
// dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
// self.enabled = YES;
// });
funclog
return YES;
}
- (NSTimeInterval)timeInterval
{
return[objc_getAssociatedObject(self,_cmd)doubleValue];
}
- (void)setTimeInterval:(NSTimeInterval)timeInterval
{
objc_setAssociatedObject(self,@selector(timeInterval),@(timeInterval),OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
//runtime動態綁定屬性
- (void)setIsIgnoreEvent:(BOOL)isIgnoreEvent{
//注意BOOL類型需要用OBJC_ASSOCIATION_RETAIN_NONATOMIC不要用錯,否則set方法會賦值出錯
objc_setAssociatedObject(self,@selector(isIgnoreEvent),@(isIgnoreEvent),OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (BOOL)isIgnoreEvent{
//_cmd == @select(isIgnore);和set方法里一致
return[objc_getAssociatedObject(self,_cmd)boolValue];
}
- (void)resetState{
[self setIsIgnoreEvent:NO];
}
+ (void)load{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
SEL selA =@selector(sendAction:to:forEvent:);
SEL selB =@selector(mySendAction:to:forEvent:);
Method methodA =class_getInstanceMethod(self, selA);
Method methodB =class_getInstanceMethod(self, selB);
//將methodB的實現添加到系統方法中也就是說將methodA方法指針添加成方法methodB的返回值表示是否添加成功
BOOL isAdd =class_addMethod(self, selA,method_getImplementation(methodB),method_getTypeEncoding(methodB));
//添加成功了說明本類中不存在methodB所以此時必須將方法b的實現指針換成方法A的,否則b方法將沒有實現。
if(isAdd) {
class_replaceMethod(self, selB,method_getImplementation(methodA),method_getTypeEncoding(methodA));
}else{
//添加失敗了說明本類中有methodB的實現,此時只需要將methodA和methodB的IMP互換一下即可。
method_exchangeImplementations(methodA, methodB);
}
});
}
//當我們按鈕點擊事件sendAction時將會執行mySendAction
- (void)mySendAction:(SEL)action to:(id)target forEvent:(UIEvent*)event
{
if([self isKindOfClass:[UIButton class]]) {
self.timeInterval=self.timeInterval==0?defaultInterval:self.timeInterval;
if(self.isIgnoreEvent){
return;
}else if(self.timeInterval>0){
[self performSelector:@selector(resetState)withObject:nil afterDelay:self.timeInterval];
}
}
//此處methodA和methodB方法IMP互換了,實際上執行sendAction;所以不會死循環
self.isIgnoreEvent=YES;
[self mySendAction:action to:target forEvent:event];
}
@end
這樣就完美解決的按鈕重復點擊的問題,親測有效
如果大家有更簡便的方法,歡迎交流 : )
總結
以上是生活随笔為你收集整理的php重复点击按钮无效,完美解决UIButton按钮重复点击、多次响应的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [设计模式] ------ 观察者模式和
- 下一篇: iOS崩溃日志收集