我下面“ 本 ”指南。 捕捉到UIView
的touchesBegan,但是当我NSLog()
的touchesBegan在UIViewController
,这是因为,它不火,但确实火在绞合的方法。 有没有一种方法,我可以把它火在这两个?
Answer 1:
当交叉混合的方法,你基本上是告诉Objective-C的运行时更改的方法选择其内部映射(你如何称呼它)的方法实现 (做什么调用时)。 实现的关键是,这些其实并不在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
}
......而是因为你已经换了选择,出现实际递归选择指向原始的实现。 这就是为什么叫[view touchesBegan: withEvent:]
结束调用摆在首位的绞合的方法。
整洁的吧?
文章来源: Method Swizzling for UIView