[英]UIButton+Category implementation override other UIButton's touch event
我正在使用带有扩展名的UIButton的开源实现,因此它是可拖动的。
这是此UIButton+NMCategory
文件的标题:
#import <UIKit/UIKit.h>
@interface UIButton (NMCategory)
@property(nonatomic,assign,getter = isDragEnable) BOOL dragEnable;
@property(nonatomic,assign,getter = isAdsorbEnable) BOOL adsorbEnable;
@end
在其实现中,它实现了onTouchesBegin
, onTouchesMoved
和onTouchesEnd
接口,它们均正常运行,并且此按钮可拖动。
但是,在项目的其余部分中,使用了可拖动按钮的另一种实现方式。 这是它的标题:
@interface SEFilterKnob : UIButton
@end
下面是如何使用它:
[knob addTarget:self action:@selector(MyTouchDown:withEvent:) forControlEvents:UIControlEventTouchDown];
[knob addTarget:self action:@selector(MyTouchUp:) forControlEvents:UIControlEventTouchUpInside | UIControlEventTouchUpOutside];
[knob addTarget:self action:@selector(MyTouchMove:withEvent:) forControlEvents: UIControlEventTouchDragOutside | UIControlEventTouchDragInside];
当我将UIButton+NMCategory
实现应用于整个项目时, SEFilterKnob
可拖动按钮停止工作,并且我发现它的触摸事件都被路由到UIButton+NMCategory
触摸事件实现。 (未调用其自身的选择器)
我不熟悉Obj-C的类别功能,请有人帮忙解释为什么会发生这种情况吗? 谢谢!
不幸的是,您不能将两者结合在一起。 另外,请务必注意Obj-C中类别的破坏性影响。
他们修改了该类的所有实例,我肯定会选择老式的子类。 这是最安全正确的决定。 尤其是当您遇到冲突时。
在类别中,您通常倾向于覆盖当前方法。
来自developer.apple.com :“当类别覆盖继承的方法时,类别中的方法可以照常通过一条消息向super调用继承的实现。但是,如果类别覆盖了该类别的方法中已经存在的方法,类,无法调用原始实现”
如果您想调用旧的/被覆盖的方法,则应尝试使用swizzling ,这是obj-c的强大功能(这不是黑客!)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.