我正在使用带有扩展名的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的类别功能,有人可以帮助解释为什么会发生这种情况吗?谢谢!
答案 0 :(得分:1)
不幸的是,你无法将两者结合起来。另外,要非常注意Obj-C中类别的破坏性影响。
他们修改了类的所有实例,我绝对选择了旧的子类。这是最安全和最正确的决定。特别是如果您遇到冲突。
答案 1 :(得分:0)
在某个类别中,您通常会覆盖当前的方法。
从 developer.apple.com :“当类别覆盖继承的方法时,类别中的方法可以像往常一样通过消息调用继承的实现到超级。但是,如果category覆盖了类别类中已经存在的方法,无法调用原始实现“
如果你想调用旧的/覆盖的方法,你应该尝试swizzling这是一个强大的obj-c功能(而且它不是黑客!)。