Runtime 控制UIButton的暴力点击

本文介绍了一种在iOS应用中防止按钮被快速连续点击的方法,通过Objective-C的Category特性为UIButton添加了间隔时间控制功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 大体上就是把 UIControl  category  把点击事件 同时指定到自己的方法里面 让每一个button都执行

#import <UIKit/UIKit.h>


@interface UIControl (Interval)


@property (nonatomic, assign) NSTimeInterval cjr_acceptEventInterval;// 可以用这个给重复点击加间隔



@end




  1. #import "UIControl+Interval.h"
    #import <objc/runtime.h>
    
    @interface UIControl()
    @property (nonatomic, assign) NSTimeInterval cjr_acceptEventTime;
    @end
    
    @implementation UIControl (Interval)
    
    static const char *UIControl_acceptEventInterval = "UIControl_acceptEventInterval";
    static const char *UIControl_acceptEventTime = "UIControl_acceptEventTime";
    
    - (NSTimeInterval )cjr_acceptEventInterval
    {
        return [objc_getAssociatedObject(self, UIControl_acceptEventInterval) doubleValue];
    }
    
    - (void)setCjr_acceptEventInterval:(NSTimeInterval)cjr_acceptEventInterval
    {
        objc_setAssociatedObject(self, UIControl_acceptEventInterval, @(cjr_acceptEventInterval), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    
    - (NSTimeInterval )cjr_acceptEventTime
    {
        return [objc_getAssociatedObject(self, UIControl_acceptEventTime) doubleValue];
    }
    
    - (void)setCjr_acceptEventTime:(NSTimeInterval)cjr_acceptEventTime
    {
        objc_setAssociatedObject(self, UIControl_acceptEventTime, @(cjr_acceptEventTime), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    
    + (void)load
    {
        //获取着两个方法
        Method systemMethod = class_getInstanceMethod(self, @selector(sendAction:to:forEvent:));
        SEL sysSEL = @selector(sendAction:to:forEvent:);
        
        Method myMethod = class_getInstanceMethod(self, @selector(cjr_sendAction:to:forEvent:));
        SEL mySEL = @selector(cjr_sendAction:to:forEvent:);
        
        //添加方法进去
        BOOL didAddMethod = class_addMethod(self, sysSEL, method_getImplementation(myMethod), method_getTypeEncoding(myMethod));
        
        //如果方法已经存在了
        if (didAddMethod)
        {
            class_replaceMethod(self, mySEL, method_getImplementation(systemMethod), method_getTypeEncoding(systemMethod));
        }else
        {
            method_exchangeImplementations(systemMethod, myMethod);
            
        }
        
        //----------------以上主要是实现两个方法的互换,load是gcd的只shareinstance,果断保证执行一次
        
    }
    
    - (void)cjr_sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event
    {
        if (NSDate.date.timeIntervalSince1970 - self.cjr_acceptEventTime < self.cjr_acceptEventInterval)
        {
            return;
        }
        
        if (self.cjr_acceptEventInterval > 0)
        {
            self.cjr_acceptEventTime = NSDate.date.timeIntervalSince1970;
        }
        
        [self cjr_sendAction:action to:target forEvent:event];
    }
    @end
    
    2:使用: #import "UIControl+Interval.h"
- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    self.navigationItem.title = @"主页";
    UIButton * button = [UIButton buttonWithType:UIButtonTypeCustom];
    button.frame = CGRectMake(200, 200, 100, 40);
    [button setTitle:@"测试" forState:UIControlStateNormal];
    button.cjr_acceptEventInterval = 5.0;
    [button setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
    [button addTarget:self action:@selector(buttonEvent:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button];
}

-(void)buttonEvent:(UIButton *)sender
{
    NSLog(@"点击打印");

}

  

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值