IOS應用防止按鈕連續(xù)點擊

THI Professional
Is life always this hard,or is it just when you are a kid?
Always like this.

在軟件開發(fā)項目中,我們經常會碰到點擊按鈕發(fā)送網絡請求,或者點擊按鈕進行頁面之間的邏輯跳轉莉掂。但是有時候遇到一些卡頓的話,用戶可能會失去耐心千扔,然后瘋狂的點擊憎妙,這時候就會多次調用按鈕觸發(fā)的方法。在某些特定的情景下會導致頁面重復push或者重復發(fā)送網絡請求曲楚。這樣的問題既對用戶體驗有影響厘唾,而且還會一定程度上增加服務器的壓力。

下面詳細講解幾種解決思路龙誊,有不完善的地方 希望大家能夠糾正抚垃。

1.在按鈕的觸發(fā)方法內部做處理

首先創(chuàng)建一個按鈕button

@interface ViewController ()
@property(nonatomic,strong)UIButton *button;
@end
- (void)viewDidLoad {
    [super viewDidLoad];

    self.button = [[UIButton alloc] initWithFrame:CGRectMake(200, 200, 100, 100)];
    self.button.backgroundColor = [UIColor redColor];    
    [self.button addTarget:self action:@selector(btnClickedOperations:) forControlEvents:UIControlEventTouchUpInside];

    [self.view addSubview:self.button];
}
- (void)btnClickedOperations:(id)sender{
            static NSTimeInterval time = 0.0;
            NSTimeInterval currentTime = [NSDate date].timeIntervalSince1970;
            //限制用戶點擊按鈕的時間間隔大于1秒鐘
              
                if (currentTime - time > 1) {
                //處理邏輯
                    NSLog(@"這是一個測試");
                }
            time = currentTime;
}

最終只有用戶的點擊時間間隔超過一秒鐘 才會再次調用你要處理的邏輯代碼。這樣就實現了避免用戶連續(xù)點擊按鈕帶來的影響。
實現效果
2.同樣在方法內部做操作
在按鈕方法內部對按鈕的狀態(tài)進行控制 在執(zhí)行完指定的操作后  用戶才可以繼續(xù)點擊按鈕  同樣可以避免連續(xù)點擊帶來的問題   這種方法適合用在處理邏輯時間比較久的情況 鹤树,如果處理邏輯時間很短暫 那么就起不到限制用戶連續(xù)點擊的情況
- (void)test:(UIButton *)btn{
    btn.enabled = NO;
    //處理邏輯
    btn.enabled = YES;
}

如果想控制按鈕的時間間隔同樣可以加一個延遲的方法

- (void)test:(UIButton *)btn{
    btn.enabled = NO;
    //處理邏輯
     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        NSLog(@"btnClickedOperations");
        btn.enabled = YES;
    });
}

實現效果
[圖片上傳中...(屏幕快照 2017-11-16 上午10.15.17.png-86dc45-1510798532321-0)]


屏幕快照 2017-11-16 上午9.53.55.png

第三種:使用runtime铣焊,一勞永逸我這設的是0.5秒內不會被重復點擊

#import <UIKit/UIKit.h>

@interface UIControl (repeatedClick)
/**
 可以重復點擊的時間間隔
 默認為0 不對按鈕重復點擊處理
 */
@property (nonatomic,assign) NSTimeInterval timeInterval;//用這個給重復點擊加間隔
/**
 內部屬性用于判斷是否忽略替換的點擊事件
 */
@property (nonatomic,assign) BOOL isIgnoreEvent;
@end
#import "UIControl+repeatedClick.h"
#import <objc/runtime.h>
#define defaultInterval 0//默認時間間隔  0.25
@implementation UIControl (repeatedClick)
- (NSTimeInterval)timeInterval{
    return [objc_getAssociatedObject(self,_cmd)doubleValue];
}

- (void)setTimeInterval:(NSTimeInterval)timeInterval{
    objc_setAssociatedObject(self,@selector(timeInterval),@(timeInterval),OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

- (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的實現添加到系統(tǒng)方法中也就是說將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互換了捣炬,實際上執(zhí)行sendAction熊昌;所以不會死循環(huán)
    self.isIgnoreEvent = YES;
    [self mySendAction:action to:target forEvent:event];
}
@end

以上就是處理按鈕連續(xù)點擊問題的解決辦法,希望能對你有所幫助湿酸,文章中的代碼已經上傳到github.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末婿屹,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子推溃,更是在濱河造成了極大的恐慌昂利,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件铁坎,死亡現場離奇詭異蜂奸,居然都是意外死亡,警方通過查閱死者的電腦和手機硬萍,發(fā)現死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進店門扩所,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人朴乖,你說我怎么就攤上這事祖屏。” “怎么了买羞?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵袁勺,是天一觀的道長。 經常有香客問我畜普,道長期丰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任吃挑,我火速辦了婚禮钝荡,結果婚禮上,老公的妹妹穿的比我還像新娘儒鹿。我一直安慰自己化撕,他們只是感情好几晤,可當我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布约炎。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪圾浅。 梳的紋絲不亂的頭發(fā)上掠手,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天,我揣著相機與錄音狸捕,去河邊找鬼喷鸽。 笑死,一個胖子當著我的面吹牛灸拍,可吹牛的內容都是我干的做祝。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼鸡岗,長吁一口氣:“原來是場噩夢啊……” “哼混槐!你這毒婦竟也來了?” 一聲冷哼從身側響起轩性,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤声登,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后揣苏,有當地人在樹林里發(fā)現了一具尸體悯嗓,經...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年卸察,在試婚紗的時候發(fā)現自己被綠了脯厨。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡蛾派,死狀恐怖俄认,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情洪乍,我是刑警寧澤眯杏,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站壳澳,受9級特大地震影響岂贩,放射性物質發(fā)生泄漏。R本人自食惡果不足惜巷波,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一萎津、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧抹镊,春花似錦锉屈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽遂黍。三九已至,卻和暖如春俊嗽,著一層夾襖步出監(jiān)牢的瞬間雾家,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工绍豁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留芯咧,地道東北人。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓竹揍,卻偏偏與公主長得像敬飒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子芬位,可洞房花燭夜當晚...
    茶點故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,297評論 25 707
  • 前幾天晶衷,我說要成立“制仗與販劍俱樂部”蓝纲,后臺有朋友X小姐的留言,“我是不是不用申請也能加入晌纫?” 對税迷,你真是不用申請...
    荒梁閱讀 537評論 0 1
  • 立冬過后,一抹暖色
    小魚兒95閱讀 60評論 0 0
  • 目錄 一锹漱、 官方產品介紹... 2 二箭养、 背景... 2 三、 用戶特征和需求... 2 四哥牍、任性點APP體驗分析...
    senlice閱讀 428評論 0 0