我正在关注" This"指南。捕获UIView
touchesBegan,但当我NSLog()
触及UIViewController
中的这个时,它不会触发,但会在混合方法中触发。有没有办法可以让它同时解雇?
答案 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:]
最终会调用你的混合方法。
整洁呃?