方法Swizzling为UIView

我正在关注“ 这个 ”指南。 捕获UIView touchesBegan,但是当我NSLog() touchesBegin在UIViewController ,这是为了,它不会触发,但在混合方法中触发。 有没有办法让我的两个人都可以开火?

当调整方法时,基本上是告诉Objective-C运行时将方法select器 (如何调用它)的内部映射更改为方法实现 (它在调用时执行的操作)。 要认识到的关键是这些在Objective-C中实际上不是同一个东西(尽pipe我们在编码时通常不会考虑这个区别)。 如果你能理解select器映射的概念,理解混合是容易的。

典型的模式是交换一个现有的方法(通常是一个你不能控制的类)与你自己的自定义方法相同的签名交换其select器,以便您的select器指向现有的实现和现有的select器指向您的实现。

完成这些之后,可以通过调用自定义方法的select器实际调用原始实现。

对于一个外部的观察者来说,这看起来会产生一个重入循环:

 - (void)swizzled_touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { // custom logic [self swizzled_touchesBegan:touches withEvent:event]; // <-- this actually calls the original implementation // custom logic } 

…但是因为你已经交换了select器,看起来像recursion的select器实际上指向了原来的实现。 这正是为什么调用[view touchesBegan: withEvent:]最终调用你的debugging方法的原因。

整洁吗?