为UIView调整方法

时间:2014-05-19 20:29:37

标签: ios objective-c uiview swizzling

我正在关注" This"指南。捕获UIView touchesBegan,但当我NSLog()触及UIViewController中的这个时,它不会触发,但会在混合方法中触发。有没有办法可以让它同时解雇?

1 个答案:

答案 0 :(得分:3)

当调配方法时,您基本上是在告诉Objective-C运行时将方法 selector (如何调用它)的内部映射更改为方法 implementation (什么时候叫它。要意识到的关键是这些在Objective-C中实际上并不相同(尽管我们在编码时通常不会考虑这种区别)。如果你能理解选择器映射的概念,那么理解混合​​很容易。

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

完成此操作后,您实际上可以通过调用自定义方法的选择器来调用原始实现。

对于外部观察者来说,这似乎会创建一个重新进入循环:

- (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
}

...但是因为你已经交换了选择器,看起来recurse的选择器实际上指向了原始实现。这就是为什么调用[view touchesBegan: withEvent:]最终会调用你的混合方法。

整洁呃?