iOS 버튼 중복 클릭 방지 방법
버튼에 대해 말하자면 여러 번 클릭할 때 프로그램이 끊겼을 때 여러 번 클릭할 때 여러 번 페이지를 돌리게 하고 여러 번 요청을 받게 된다. 여기서 세 가지 중복 클릭을 방지하는 방법을 정리한다.
첫 번째: 클릭할 때마다 이전의 조작을 취소합니다
- (void)buttonAction:(id)sender
{
[[self class] cancelPreviousPerformRequestsWithTarget:self selector:@selector(buttonAction:) object:sender];
[self performSelector:@selector(buttonAction:) withObject:sender afterDelay:0.2f];
}
두 번째: 클릭 후 클릭 불가 상태로 설정하고 몇 초 후 회복:
-(void)buttonAction:(id)sender
{
self.button.enabled = NO;
[self performSelector:@selector(changeButtonStatus) withObject:sender afterDelay:1.0f];//
}
-(void)changeButtonStatus
{
self.button.enabled = YES;
}
세 번째:runtime를 사용하면 일로영일 0.5초 동안 중복 클릭을 받지 않습니다
1. #import 가져오기(PCH 파일에 넣을 수 있음) 2.UIControl 또는 UIButton의 분류를 만듭니다!분류 파일 만들기:2.1 Xcode에서 새 파일을 열고 OC 파일 2.2를 두 번째 인터페이스에서 선택합니다. File 이름은 UIControl+Button Con입니다.h, 파일 형식인 File Type을 Category 클래스로 선택하고 클래스에서 계승된 클래스를 선택하십시오. 여기서 선택한 클래스는 UIButton 주석입니다. UIButton으로 분류하면 UIButton이 만든 단추에 반응합니다.2.3 분류가 작성되면 분류 작업
.h 파일
#import
#import
#define defaultInterval .5 //
@interface UIControl (ButtonCon)
@property(nonatomic,assign)NSTimeInterval timeInterval; //
@property(nonatomic,assign)BOOL isIgnoreEvent; //YES NO
@end
.m 파일
#import "UIControl+ButtonCon.h"
@implementation UIControl (ButtonCon)
- (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
{
objc_setAssociatedObject(self, @selector(isIgnoreEvent), @(isIgnoreEvent), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (BOOL)isIgnoreEvent
{
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);
}
});
}
- (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];
}
@end
끝말
여기까지만 하면 끝입니다. 모르시면 댓글을 남겨주시고, 채팅방에 가입하셔서 좋아하시면 팔로우, 소장, 좋아요를 눌러주세요.
그룹 번호: 552048526
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.