iOS 利用运行时交换系统方法实现禁止同时点击两个按钮触发多个事件

#import "UIViewController+Parents.h"

/** 导入头文件 */

#import <objc/runtime.h>

@implementation UIViewController (Parents)

//load方法会在类第一次加载的时候被调用

//调用的时间比较靠前,适合在这个方法里做方法交换

+ (void)load{

//方法交换应该被保证,在程序中只会执行一次

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

//获得viewController的生命周期方法的selector

SEL systemSel = @selector(viewDidDisappear:);

//自己实现的将要被交换的方法的selector

SEL swizzSel = @selector(swiz_viewDidDisappear:);

//两个方法的Method

Method systemMethod = class_getInstanceMethod([self class], systemSel);

Method swizzMethod = class_getInstanceMethod([self class], swizzSel);

//首先动态添加方法,实现是被交换的方法,返回值表示添加成功还是失败

BOOL isAdd = class_addMethod(self, systemSel, method_getImplementation(swizzMethod), method_getTypeEncoding(swizzMethod));

if (isAdd) {

//如果成功,说明类中不存在这个方法的实现

//将被交换方法的实现替换到这个并不存在的实现

class_replaceMethod(self, swizzSel, method_getImplementation(systemMethod), method_getTypeEncoding(systemMethod));

}else{

//否则,交换两个方法的实现

method_exchangeImplementations(systemMethod, swizzMethod);

}

});

}

- (void)swiz_viewDidDisappear:(BOOL)animated{

//这时候调用自己,看起来像是死循环

//但是其实自己的实现已经被替换了

[self swiz_viewDidDisappear:animated];

[self setExclusiveTouchForButtons:self.view];

NSLog(@"swizzle");

}

-(void)setExclusiveTouchForButtons:(UIView *)myView

{

for (UIView * v in [myView subviews]) {

if([v isKindOfClass:[UIButton class]])

[((UIButton *)v) setExclusiveTouch:YES];

else if ([v isKindOfClass:[UIView class]]){

[self setExclusiveTouchForButtons:v];

}

}

}

时间: 2024-12-29 23:54:16

iOS 利用运行时交换系统方法实现禁止同时点击两个按钮触发多个事件的相关文章

iOS动态运行时方法

在某些时候,程序可能需要根据获取的参数来决定调用的方法. 要实现这样的功能,就需要使用到动态运行时方法了. 首先需要定义好接口,以便调用. 然后就是动态调用定义好的方法. 这里有两种方法, 第一种: // 有参数则需要加上冒号 SEL sel = NSSelectorFromString(@"save:"); MyObject obj = [MyObject new]; [obj performSelector:sel withObject:@{@"1":@&quo

iOS开发小技巧--利用运行时得到隐藏的成员变量

一.关于运行时,已经从网络上摘抄了一片文章,这里只有项目中自己的简单使用 -- 查找隐藏的成员变量 导入头文件 可以获得隐藏的成员变量,方法,属性等 代码: 打印效果图:

iOS runtime运行时详解

什么是runtime? runtime直译就是运行时间,run(跑,运行) time(时间),网上大家都叫它运行时,它是一套比较底层的纯C语言API,属于一个C语言库,包含了很多底层的C语言API,它是OC的幕后工作者,我们平时写的OC代码,在运行过程时,都会转为runtime的C语言代码 runtime有什么用? 如果你之前不知道runtime,可能觉得它没什么用,其实他的作用非常强大.下面我们就以代码的形式为大家揭开runtime的神秘面纱 作用1  获取一个类全部成员变量名(如果你的成员私

使用运行时交换我们自定义的方法

1.创建一个OC的程序,写几个方法 实现方法交换 来自为知笔记(Wiz)

利用运行时遍历一个类中的成员变量。

// 备注:可以在需要的地方调用这段代码. // 但是调用前必须引用 #import <objc/runtime.h> 头文件 - (void)ivarListDemo { unsigned int count; Ivar *ivarArray = class_copyIvarList([UITextField class], &count); for (int i = 0; i < count; i++) { Ivar ivar = ivarArray[i]; NSLog(@&

利用运行时给模型赋值

前提是模型属性和key要一致 下面的代码只需要修改这个类方法就可以用了 +(instancetype)userCommentsWithDict:(NSDictionary *)dict{    id obj = [[self alloc]init];    NSArray *array =[self loadProperties];        for (NSString *key in array) {        if (dict[key]) {            [obj setV

iOS开发——运行时OC篇&amp;使用运行时获取系统的属性:使用自己的手势修改系统自带的手势

使用运行时获取系统的属性:使用自己的手势修改系统自带的手势 有的时候我需要实现一个功能,但是没有想到很好的方法或者想到了方法只是那个方法实现起来太麻烦,一或者确实为了装逼,我们就会想到iOS开发中最牛逼的技术运行时(Runtime) 关于运行时这里就不多说了,请查看笔者之前搬过来了精选文章,这里主要是怎么在实际开发中使用运行时实现我们想要的功能. 比如,在iOS开发中有这样一个问题,关于导航栏中我们点击一个按钮会跳到对应的子控制器,但是这里问题就来了,我们在对应的字控制器中可以点击对应的back

iOS 运行时详解

注:本篇文章转自:http://www.jianshu.com/p/adf0d566c887 一.运行时简介 Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理.对于Objective-C来说,这个运行时系统就像一个操作系统一样:它让所有的工作可以正常的运行.Runtime基本上是用C和汇编写的,这个库使得C语言有了面向对象的能力.在Runtime中,对象可以用C语言中的结构体表示,而方法可以用C函数来实现,另外再加上了一些额外的特性.这些结构体和

运行时类型信息RTTI

我们在写C++代码的时候经常碰到使用dynamic_cast进行类型转换的情况,也都知道经过dynamic_cast的转换更加安全,因为dynamic_cast进行了类型检查. 但是可能很多人不知道dynamic_cast是C++ 运行时类型信息(RTTI)机制链条上的一个节点. RTTI提供了两个操作符和一个类: dynamic_cast typeid type_info 整个RTTI, 作为一个整体,暴露给程序员的就是这三个元素.因此我们关注的焦点也就在它们身上了. 什么是RTTI 在C++