日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php重复点击按钮无效,完美解决UIButton按钮重复点击、多次响应的问题

發布時間:2024/7/23 php 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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按钮重复点击、多次响应的问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。