所有UIButton的ios触觉反馈全局

时间:2018-10-05 13:10:47

标签: ios objective-c iphone uibutton

如何为每个UIButton的每个touchupinside事件在整个应用程序中应用触觉反馈,而无需为每个按钮编写代码?我曾尝试制作一个UIButton类别并覆盖- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event,但是这弄乱了我的某些UIButton动作,(我可能执行得不好)

有人有什么建议吗?

2 个答案:

答案 0 :(得分:3)

在类中覆盖@ChoungTran这样的方法并不是一个好主意。如果要自定义类别中的默认方法,最好在swizzled method中进行。

但是,我宁愿创建一个从UIButton派生的自定义类,并在其中实现该逻辑,并在需要触觉的任何地方使用该按钮。


来自Apple documentation

  

尽管目前使用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时注册事件