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

时间:2014-07-26 19:22:26

标签: ios objective-c uibutton objective-c-category

我正在使用带有扩展名的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

并且在它的实现中,它实现了onTouchesBeginonTouchesMovedonTouchesEnd接口,这些接口都运行正常,此按钮变为可拖动。

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

@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的类别功能,有人可以帮助解释为什么会发生这种情况吗?谢谢!

2 个答案:

答案 0 :(得分:1)

不幸的是,你无法将两者结合起来。另外,要非常注意Obj-C中类别的破坏性影响。

他们修改了类的所有实例,我绝对选择了旧的子类。这是最安全和最正确的决定。特别是如果您遇到冲突。

答案 1 :(得分:0)

在某个类别中,您通常会覆盖当前的方法。

developer.apple.com :“当类别覆盖继承的方法时,类别中的方法可以像往常一样通过消息调用继承的实现到超级。但是,如果category覆盖了类别类中已经存在的方法,无法调用原始实现“

如果你想调用旧的/覆盖的方法,你应该尝试swizzling这是一个强大的obj-c功能(而且它不是黑客!)。