简体   繁体   中英

UIButton addTarget does not work

ViewController:

@implementation PaiLifeViewController
@synthesize detail = _detail;
- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    UIImage *i = [UIImage imageNamed:@"menu_patcode_normal"];
    UIButton *c1 = [[UIButton alloc] init];
    c1.tag = 11;
    UIButton *c2 = [[UIButton alloc] init];
    c2.tag = 12;
    UIButton *c3 = [[UIButton alloc] init];
    c3.tag = 13;
    UIButton *c4 = [[UIButton alloc] init];
    c4.tag = 21;
    UIButton *c5 = [[UIButton alloc] init];
    c5.tag = 22;
    UIButton *c6 = [[UIButton alloc] init];
    c6.tag = 23;
    UIButton *c7 = [[UIButton alloc] init];
    c7.tag = 31;
    UIButton *c8 = [[UIButton alloc] init];
    c8.tag = 32;
    UIButton *c9 = [[UIButton alloc] init];
    c9.tag = 33;

    [c1 setBackgroundImage:i forState:UIControlStateNormal];
    [c2 setBackgroundImage:i forState:UIControlStateNormal];
    [c3 setBackgroundImage:i forState:UIControlStateNormal];
    [c4 setBackgroundImage:i forState:UIControlStateNormal];
    [c5 setBackgroundImage:i forState:UIControlStateNormal];
    [c6 setBackgroundImage:i forState:UIControlStateNormal];
    [c7 setBackgroundImage:i forState:UIControlStateNormal];
    [c8 setBackgroundImage:i forState:UIControlStateNormal];
    [c9 setBackgroundImage:i forState:UIControlStateNormal];

    NSArray *c = [[NSArray alloc] initWithObjects:c1,c2,c3,c4,c5,c6,c7,c8,c9, nil];
    _detail= [[PaiLifePageDetail alloc] initWithDataSource:c pageIndex:1];
    for (UIButton *b in c)
    {
        [b addTarget:self action:@selector(clicked:) forControlEvents:UIControlEventTouchUpInside];
    }
    [self.view addSubview:_detail];
}

- (void) clicked : (UIButton *) button
{
    NSLog(@"button = %i", button.tag);
}

@end

Custom View:

@implementation PaiLifePageDetail
#define MARGINTOTOP 120.0
#define MARGINTOLEFT 20.0
#define WIDTH 80.0
#define HEIGHT 60.0

- (id) initWithDataSource : (NSArray *) dataSource pageIndex : (int) pageIndex;
{
    self = [super init];
    if (self)
    {
        if (dataSource)
        {
            for (UIButton *button in dataSource)
            {
                //page 1 line 1
                if (pageIndex == 1)
                {
                    if (button.tag == 11)
                    {
                        button.frame = CGRectMake(MARGINTOLEFT, MARGINTOTOP, WIDTH * 2 + 20, HEIGHT);
                        [self addSubview:button];
                    }
                    else if (button.tag == 12)
                    {
                        button.frame = CGRectMake(MARGINTOLEFT + WIDTH * 2 + 20 * 2, MARGINTOTOP, WIDTH, HEIGHT);
                        [self addSubview:button];
                    }
                }
                //not page 1 line 1
                else
                {
                    if ( button.tag == 11 )
                    {
                        button.frame = CGRectMake(MARGINTOLEFT, MARGINTOTOP, WIDTH, HEIGHT);
                        [self addSubview:button];
                    }
                    else if ( button.tag == 12 )
                    {
                        button.frame = CGRectMake(MARGINTOLEFT + WIDTH + 20, MARGINTOTOP, WIDTH, HEIGHT);
                        [self addSubview:button];
                    }
                    else if ( button.tag == 13 )
                    {
                        button.frame = CGRectMake(MARGINTOLEFT + (WIDTH + 20) * 2, MARGINTOTOP, WIDTH, HEIGHT);
                        [self addSubview:button];
                    }
                }

                // line 2
                if ( button.tag == 21 )
                {
                    button.frame = CGRectMake(MARGINTOLEFT, MARGINTOTOP + HEIGHT + 20, WIDTH, HEIGHT);
                    [self addSubview:button];
                }
                else if ( button.tag == 22 )
                {
                    button.frame = CGRectMake(MARGINTOLEFT + WIDTH + 20, MARGINTOTOP + HEIGHT + 20, WIDTH, HEIGHT);
                    [self addSubview:button];
                }
                else if ( button.tag == 23 )
                {
                    button.frame = CGRectMake(MARGINTOLEFT + (WIDTH + 20) * 2, MARGINTOTOP + HEIGHT + 20, WIDTH, HEIGHT);
                    [self addSubview:button];
                }

                // line 3
                if ( button.tag == 31 )
                {
                    button.frame = CGRectMake(MARGINTOLEFT, MARGINTOTOP + (HEIGHT + 20) * 2, WIDTH, HEIGHT);
                    [self addSubview:button];
                }
                else if ( button.tag == 32 )
                {
                    button.frame = CGRectMake(MARGINTOLEFT + WIDTH + 20, MARGINTOTOP + (HEIGHT + 20) * 2, WIDTH, HEIGHT);
                    [self addSubview:button];
                }
                else if ( button.tag == 33 )
                {
                    button.frame = CGRectMake(MARGINTOLEFT + (WIDTH + 20) * 2, MARGINTOTOP + (HEIGHT + 20) * 2, WIDTH, HEIGHT);
                    [self addSubview:button];
                }
            }
        }
    }
    return self;
}

@end

在此输入图像描述

在此输入图像描述

But when I click these buttons , they do not work at all , please help me with this, thank you very much.

This is probably a touch handeling event issue. Ie the touches are never getting to you custom button. To debug this:

  1. What is your button's subclass?
  2. Check userInterction enabled?
  3. Check your superviews of the button for UIGestureRecognizer - they can interfere with touch handeling.
  4. Is you clipsToBounds property NO? If so are the touches outside the bounds of the view?
  5. Override the touchesBegan in your custom button to see if its being called.

I had the same issue when I already had button below the superview of my button, for which I wanted to add target. I have changed the frame of my button., then the problem was solved

The method: (id)initWithFrame:(CGRect)frame is not used to create those PaiLifeCustomButton type buttons.

Or set a frame manually after calling init. I'vent looked much into your code but it all looks fine. Set breakpoints to see if your code runs or not.

I had the same issue,the problem is My view was creating with init instead of initWithFrame. Incase Anyone have same issue, then it may help you.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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