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