Ios 无法点击自定义按钮

Ios 无法点击自定义按钮,ios,objective-c,uibutton,Ios,Objective C,Uibutton,我正在创建一个表示购物车的自定义UI按钮。如果用户的购物车中有物品,则按钮会在右上角显示一个徽章,显示购物车中的物品数量。按钮和徽章的视觉外观工作正常。但是,在按钮上注册触摸事件不起作用。我已经阅读了关于这个主题的所有堆栈溢出问题,但找不到答案 我正在使用以下库绘制徽章: 下面是我的自定义按钮类。在setup方法中,我监听轻敲。永远不会调用回调方法 @interface BadgeCartButton() - (void) setup; - (UIImage *)_cartImage; @

我正在创建一个表示购物车的自定义UI按钮。如果用户的购物车中有物品,则按钮会在右上角显示一个徽章,显示购物车中的物品数量。按钮和徽章的视觉外观工作正常。但是,在按钮上注册触摸事件不起作用。我已经阅读了关于这个主题的所有堆栈溢出问题,但找不到答案

我正在使用以下库绘制徽章:

下面是我的自定义按钮类。在
setup
方法中,我监听轻敲。永远不会调用回调方法

@interface BadgeCartButton()

- (void) setup;
- (UIImage *)_cartImage; 

@end

@implementation BadgeCartButton

+ (instancetype)make {
    // The badge itself is drawn relative to the frame of this view.
    CGRect frame = CGRectMake(0, 0, [[self class] cartSize], [[self class] cartSize]);
    return [[self alloc] initWithFrame:frame];
}

- (instancetype)init {
    self = [super init];
    [self setup];
    return self;
}

- (id)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];
    [self setup];
    return self;
}

- (instancetype)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    [self setup];
    return self;
}

+ (NSInteger)cartSize {
    return 35;
}

- (NSAttributedString *)badgeAttributedTextForQuantityZero {
    return nil;
}

- (BOOL)shouldDisplayBadgeForQuantityZero {
    return NO;
}

- (UIFont *)badgeFont {
    return [super badgeFont];
}

- (CGFloat)badgePadding {
    return 3;
}

- (NSString *)badgeTextForQuantityZero {
    // By default, no badge to show if the quantity is 0.
    return nil;
}

- (UIColor *) badgeBackgroundColorForQuantityZero {
    return nil;
}

- (UIColor *)badgeTextColorForQuantityZero {
    return nil;
}

- (CGFloat)badgeOriginX {
    return [super badgeOriginX] - 3;
}

- (CGFloat)badgeOriginY {
    return [super badgeOriginY];
}


-(void)cartButtonWasTapped{
     // This method is never called        
}

- (void) setup {
    [self addTarget:self action:@selector(cartButtonWasTapped) forControlEvents:UIControlEventTouchUpInside]; // listening here, never called
    [self setImage:[self _cartImage] forState:UIControlStateNormal];
    self.accessibilityLabel = @"cartButton";
    self.accessibilityIdentifier = @"cartButton";
    [self.KVOController observe:self keyPath:@"quantity" options:NSKeyValueObservingOptionInitial|NSKeyValueObservingOptionNew action:@selector(updateBadge)];
    self.quantity = @0;
    self.shouldHideBadgeAtZero = ![self shouldDisplayBadgeForQuantityZero];

}

- (UIColor *)badgeBGColor {
    return [MYTheme cautionColor];
}

- (UIColor *)badgeTextColor {
    return [MYTheme lightTextColor];
}

+ (UIColor *)cartColor {
    return [MYTheme actionColor];
}

- (UIImage *)_cartImage {
    FAKIonIcons *cartIcon = [FAKIonIcons ios7CartOutlineIconWithSize:[[self class] cartSize]];
    [cartIcon addAttribute:NSForegroundColorAttributeName value:[[self class] cartColor]];
    CGSize size = CGSizeMake([[self class] cartSize], [[self class] cartSize]);
    return [cartIcon imageWithSize:size];
}

- (void)updateBadge {
    if ([_quantity integerValue] == 0) {
        if ([self shouldDisplayBadgeForQuantityZero]) {
            NSString *quantityZeroText = [self badgeTextForQuantityZero];
            if (quantityZeroText) {
                self.badgeValue = quantityZeroText;
            } else {
                NSAttributedString *quantityZeroAttributedText = [self badgeAttributedTextForQuantityZero];
                if (quantityZeroAttributedText) {
                    self.attributedBadgeValue = quantityZeroAttributedText;
                }
            }

            UIColor *quantityZeroBackgroundColor = [self badgeBackgroundColorForQuantityZero];
            if (quantityZeroBackgroundColor) {
                self.badgeBGColor = quantityZeroBackgroundColor;
            }

            UIColor *quantityZeroTextColor = [self badgeTextColorForQuantityZero];
            if (quantityZeroTextColor) {
                self.badgeTextColor = quantityZeroTextColor;
            }
        }
    } else if (_quantity > 0) {
        BOOL colorsMayHaveBeenChangedByQuantityZero = [self shouldDisplayBadgeForQuantityZero];

        if (colorsMayHaveBeenChangedByQuantityZero) {
            self.badgeBGColor = [self badgeBGColor];
            self.badgeTextColor = [self badgeTextColor];
        }

        self.badgeValue = [self.quantity stringValue];
    }
    [self setNeedsDisplay];
}

@end
我花了3个小时阅读了所有我能读的东西,但没有结果。知道发生了什么吗

我正在测试我的按钮,将其添加到视图控制器中,如下所示:

@implementation TestViewController

- (void)touched{
    NSLog(@"TOUCH");
}

- (void)viewDidLoad {
    [super viewDidLoad];

    BadgeCartButton *btn = [BadgeCartButton make];
    btn.frame = CGRectMake(100, 100, 60, 60);
    [btn addTarget:self action:@selector(touched) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:btn];
}

@end

请在设置方法下从按钮类中删除此行:

[自我添加目标:自我操作:@选择器(cartButtonWasTapped) forControlEvents:UIControlEventTouchUpInside];//听着这里,从来没有打过电话


您可以在添加此按钮对象的类中添加目标。

更新:我清理了,一切正常。我爱XCode

我有点困惑。。。您正在添加两个目标。。按钮本身带有选择器
cartButtonWasTapped
和带有选择器
的TestViewController已触摸
。为什么给按钮两个目标?没有特别的原因,只是为了测试。但是这不应该破坏代码吗?我添加这个按钮是为了测试tap功能。这不会破坏代码吗?@Bibs您可以通过注释这行代码来尝试。在basic中,我们可以为一个控制事件添加单个目标。