iOS 버튼 폭력 클릭 의 편리 한 해결 방안 을 자세히 알 아 보 세 요.
1.프로그램 에서 대량의 단 추 를 연속 으로 응답 하 는 검 사 를 하지 않 았 습 니 다.테스트 인원 이 연속 으로 클릭 하면 불필요 한 문제 가 많이 발생 하기 때문에 실행 시의 특성 을 이용 하여 hook 을 할 수 밖 에 없습니다.런 타임 은 대량으로 사용 할 수 없 지만 가끔 사용 하 는 것 도 편리 합 니 다.하하.
2.훅 이 필요 없 는 단일 버튼 설정
3.버튼 을 여러 번 누 르 고 마지막 클릭 이벤트 만 실행 하 며 앞의 클릭 시간 을 무시 합 니 다.
//// UIButton+touch.h
// LiqForDoctors
#import#define defaultInterval .5 //
@interface UIButton (touch)
/** */
@property (nonatomic, assign) NSTimeInterval timeInterval;
@end
//
// UIButton+touch.m
// LiqForDoctors
//
#import "UIButton+touch.h"
@interface UIButton()
/**bool YES NO UI */
@property (nonatomic, assign) BOOL isIgnoreEvent;
@end
@implementation UIButton (touch)
+ (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);
}
});
}
- (NSTimeInterval)timeInterval
{
return [objc_getAssociatedObject(self, _cmd) doubleValue];
}
- (void)setTimeInterval:(NSTimeInterval)timeInterval
{
objc_setAssociatedObject(self, @selector(timeInterval), @(timeInterval), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
// sendAction mySendAction
- (void)mySendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event
{
if ([NSStringFromClass(self.class) isEqualToString:@"UIButton"]) {
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];
}
//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];
}
@end
demo 다운로드:demo이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Swift의 패스트 패스Objective-C를 대체하기 위해 만들어졌지만 Xcode는 Objective-C 런타임 라이브러리를 사용하기 때문에 Swift와 함께 C, C++ 및 Objective-C를 컴파일할 수 있습니다. Xcode는 S...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.