如何为每个UIButton的每个touchupinside事件在整个应用程序中应用触觉反馈,而无需为每个按钮编写代码?我曾尝试制作一个UIButton类别并覆盖- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
,但是这弄乱了我的某些UIButton动作,(我可能执行得不好)
有人有什么建议吗?
答案 0 :(得分:3)
在类中覆盖@ChoungTran这样的方法并不是一个好主意。如果要自定义类别中的默认方法,最好在swizzled method中进行。
但是,我宁愿创建一个从UIButton派生的自定义类,并在其中实现该逻辑,并在需要触觉的任何地方使用该按钮。
尽管目前使用Objective-C语言可以使用 类别以覆盖类继承的方法,甚至方法 在类接口中声明,强烈不鼓励您 这样做。类别不能替代子类。有 使用类别覆盖的几个重大缺点 方法:
当类别覆盖继承的方法时, 类别可以照常通过以下方式调用继承的实现: 消息超。但是,如果类别覆盖了一个方法, 存在于类别的类中,无法调用原始 实施。
一个类别不能可靠地覆盖另一个类别中声明的方法 相同类别的类别。
这个问题特别重要,因为许多可可 类是使用类别实现的。框架定义的方法 您尝试覆盖本身可能已在某个类别中实现, 因此没有定义哪个实现优先。
某些类别方法的存在可能会导致行为更改 跨所有框架。例如,如果您覆盖 windowWillClose:NSObject类别中的委托方法,所有窗口 然后,程序中的委托将使用category方法进行响应;的 您所有NSWindow实例的行为可能会更改。分类你 在框架类上添加可能会导致行为的神秘变化,并且 导致崩溃。
答案 1 :(得分:1)
尝试对UIButton类使用类别。在UIButton扩展注册事件中的ControlEvents:UIControlEventTouchUpInside
#import "UIButton+Extention.h"
@implementation UIButton (Extention)
- (instancetype)init
{
self = [super init];
if (self)
{
[self addTarget:self action:@selector(customTouchUpInside:) forControlEvents:UIControlEventTouchUpInside];
}
return self;
}
-(void)awakeFromNib
{
[super awakeFromNib];
[self addTarget:self action:@selector(customTouchUpInside:)
forControlEvents:UIControlEventTouchUpInside];
}
- (void)customTouchUpInside:(UIButton *)sender
{
//TODO:
NSLog(@"Do something here...");
}
@end
已更新:程序化创建UIButton时注册事件