问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

iOS 怎样才能做到多次点击只跳转一次

发布网友 发布时间:2022-04-22 15:49

我来回答

1个回答

热心网友 时间:2023-10-20 15:14

创建一个UIControl的分类

Snip20160816_3.png

Snip20160816_4.png

为了方便他人调整不同的间隔时间需求,在UIControl+Custom.h文件中开放间隔时间属性,UIControl+Custom.h文件的代码为:
// UIControl+Custom.h
// Created by ocarol on 16/8/16.
// Copyright © 2016年 ocarol. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface UIControl (Custom)
@property (nonatomic, assign) NSTimeInterval custom_acceptEventInterval;// 可以用这个给重复点击加间隔
@end

在UIControl+Custom.m文件中实现方法交换(妥善的做法是:先添加方法,如果方法已经存在,就替换原方法),在UIControl+Custom.m文件的代码为:
// UIControl+Custom.m
// Created by ocarol on 16/8/16.
// Copyright © 2016年 ocarol. All rights reserved.
//

#import "UIControl+custom.h"
#import <objc/runtime.h>

@interface UIControl()
@property (nonatomic, assign) NSTimeInterval custom_acceptEventTime;
@end

@implementation UIControl (Custom)

+ (void)load{
Method systemMethod = class_getInstanceMethod(self, @selector(sendAction:to:forEvent:));
SEL sysSEL = @selector(sendAction:to:forEvent:);

Method customMethod = class_getInstanceMethod(self, @selector(custom_sendAction:to:forEvent:));
SEL customSEL = @selector(custom_sendAction:to:forEvent:);

//添加方法 语法:BOOL class_addMethod(Class cls, SEL name, IMP imp, const char *types) 若添加成功则返回No
// cls:被添加方法的类 name:被添加方法方法名 imp:被添加方法的实现函数 types:被添加方法的实现函数的返回值类型和参数类型的字符串
BOOL didAddMethod = class_addMethod(self, sysSEL, method_getImplementation(customMethod), method_getTypeEncoding(customMethod));

//如果系统中该方法已经存在了,则替换系统的方法 语法:IMP class_replaceMethod(Class cls, SEL name, IMP imp,const char *types)
if (didAddMethod) {
class_replaceMethod(self, customSEL, method_getImplementation(systemMethod), method_getTypeEncoding(systemMethod));
}else{
method_exchangeImplementations(systemMethod, customMethod);

}
}

- (NSTimeInterval )custom_acceptEventInterval{
return [objc_getAssociatedObject(self, "UIControl_acceptEventInterval") doubleValue];
}

- (void)setCustom_acceptEventInterval:(NSTimeInterval)custom_acceptEventInterval{
objc_setAssociatedObject(self, "UIControl_acceptEventInterval", @(custom_acceptEventInterval), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

- (NSTimeInterval )custom_acceptEventTime{
return [objc_getAssociatedObject(self, "UIControl_acceptEventTime") doubleValue];
}

- (void)setCustom_acceptEventTime:(NSTimeInterval)custom_acceptEventTime{
objc_setAssociatedObject(self, "UIControl_acceptEventTime", @(custom_acceptEventTime), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

- (void)custom_sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event{

// 如果想要设置统一的间隔时间,可以在此处加上以下几句
// 值得提醒一下:如果这里设置了统一的时间间隔,会影响UISwitch,如果想统一设置,又不想影响UISwitch,建议将UIControl分类,改成UIButton分类,实现方法是一样的
// if (self.custom_acceptEventInterval <= 0) {
// // 如果没有自定义时间间隔,则默认为2秒
// self.custom_acceptEventInterval = 2;
// }

// 是否小于设定的时间间隔
BOOL needSendAction = (NSDate.date.timeIntervalSince1970 - self.custom_acceptEventTime >= self.custom_acceptEventInterval);

// 更新上一次点击时间戳
if (self.custom_acceptEventInterval > 0) {
self.custom_acceptEventTime = NSDate.date.timeIntervalSince1970;
}

// 两次点击的时间间隔小于设定的时间间隔时,才执行响应事件
if (needSendAction) {
[self custom_sendAction:action to:target forEvent:event];
}

}
@end
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
宁波社保卡办理需要什么材料 宁波社保卡如何申领 有什么高性价比的隔离霜可以推荐? 防晒效果好的隔离霜有哪些值得入手? 下雨天经常爬在房子墙上的那种软体动物,不是蜗牛没壳的,可以在墙上把身... 原来是美男啊里面插曲、主题曲都有哪些? 请问下各位大虾,我在外地用外地农行卡网上转账到本地邮政卡星期六转账的... 为什么用支付宝买东西明明我余额足够,付款时却说我余额不足?2个... 萍乡烛式过滤器品牌 衡水烛式过滤器品牌推荐 怎样降低iOS代码耦合性 如何在 iOS 中解决循环引用的问题 ios 自定义对象怎么去除重复 ios property 属性有哪些修饰符 有什么作用 香港恒生账户被银行注销怎么办 近期被账户被恒生银行冻结限制服务的看这里。 梅州五华茶亭岗柚子特点? 香港恒生银行公司账户收到注销新,会马上被注销吗 香港恒生银行冻结账户说的行政原因是什么意思 恒生电子有没有被立案调查 我公司收到恒生银行要检讨的邮件里面有一份问有没有经营其他公司,二公司的业务联系,新开香港公司的目的 香港银行的账户被关闭了,香港的公司还要继续维护下去吗? 香港恒生银行公司账户冻结了,钱可以取出来吗 我的香港恒生银行账户被停用,后面有人给我汇了一笔美金,我能收到吗 最近有朋友在香港开的恒生银行账户被封了,如何解封?急 恒生银行账户被封,如何解封? 我们是香港公司,在香港恒生银行开的户突然被取消,账户里还有一二十万美元,不知道为什么被取消? 有恒生银行账户被封的朋友吗?如何解封 鏈夐┈娑﹀湪灏辫屼簡锛屾垜浠鍦ㄤ笉鍦ㄦ剰涔変笉澶是什么字 恒生帐号关了后,恒生保险怎么交? iOS 协议问题 多少人知道ios app里点击屏幕上边沿让页面滚回顶部 ios copy和strong的区别 梅州 哪些镇 哪些村 柚子园最多? 详细点谢谢啦 急 ios oc的动态识别是指什么 除了广东梅州,哪里还盛产柚子? ios 怎么做到每个页面都有侧滑栏 ios uibutton怎样去掉高亮透明效果 IOS工程中如何去掉第三方的警告 ios 怎么用runtime来动态传值修改属性 阴阳师手游全平台区安卓玩家开的阴阳寮,ios玩家能进入吗?互通吗 ios 怎么给read-only属性复制 iOS 怎么获取短信验证码 怎么在ios开发中使用opengl iOS通知和KVO的区别和用法 怎样查找电脑中的视频文件 如何才能搜索出电脑内的所有视频文件? 怎样快速搜索存在电脑上的视频 怎么查找笔记本电脑里面的视频 什么是腊月日?