UIButton+Category 实现覆盖其他 UIButton 的触摸事件



我使用一个开源的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, onTouchesMovedonTouchesEnd接口,这些接口都可以正常工作,并且该按钮可以拖动。

然而,在我项目的其余部分中,使用了另一种可拖动按钮的实现。这是它的标题:

@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中类别的破坏性影响。

它们修改了类的所有实例,我肯定选择了旧的子类。这是最安全、最正确的决定。

在一个类别中,你通常倾向于覆盖当前的方法。

From developer.apple.com:"当一个类别覆盖了一个继承的方法时,该类别中的方法可以像往常一样,通过给super的消息调用继承的实现。但是,如果类别覆盖了类别类中已经存在的方法,则无法调用原始实现"

如果您喜欢调用旧的/重写的方法,您应该尝试swizzling,这是一个强大的obj-c特性(而且它不是一个hack!)。

最新更新