繁体   English   中英

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

[英]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

在其实现中,它实现了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的类别功能,请有人帮忙解释为什么会发生这种情况吗? 谢谢!

不幸的是,您不能将两者结合在一起。 另外,请务必注意Obj-C中类别的破坏性影响。

他们修改了该类的所有实例,我肯定会选择老式的子类。 这是最安全正确的决定。 尤其是当您遇到冲突时。

在类别中,您通常倾向于覆盖当前方法。

来自developer.apple.com :“当类别覆盖继承的方法时,类别中的方法可以照常通过一条消息向super调用继承的实现。但是,如果类别覆盖了该类别的方法中已经存在的方法,类,无法调用原始实现”

如果您想调用旧的/被覆盖的方法,则应尝试使用swizzling ,这是obj-c的强大功能(这不是黑客!)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM