iOS 버튼 중복 클릭 방지 방법

3675 단어
간단한 소개
버튼에 대해 말하자면 여러 번 클릭할 때 프로그램이 끊겼을 때 여러 번 클릭할 때 여러 번 페이지를 돌리게 하고 여러 번 요청을 받게 된다. 여기서 세 가지 중복 클릭을 방지하는 방법을 정리한다.
첫 번째: 클릭할 때마다 이전의 조작을 취소합니다
- (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

좋은 웹페이지 즐겨찾기