Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

iOS - Dynamic Buttons

I'm trying to use dynamic buttons created via code (no IB) in my project and they appear where and how I want them but they don't fire their actions.

UIButton *button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    button1.frame = CGRectMake(475, 302, 49, 58);
    [button1 setTitle:@"1" 
             forState:(UIControlState)UIControlStateNormal];
    [button1 addTarget:self
                action:@selector(goToFirstTrailer) 
      forControlEvents:(UIControlEvents)UIControlEventTouchDown];
    [myImageView addSubview:button1];


-(void)goToFirstTrailer {
    [self startAnimator:@"OutsideToTrailer1_" forNumFrames:60];
}

The imageView this is placed on has buttons and User Interaction Enabled On.

Any light you can shed would be much appreciated.

like image 864
Mytheral Avatar asked Feb 16 '11 14:02

Mytheral


1 Answers

I think you have the wrong signature of the action method change that line to

-(void) goToFirstTrailer:(id)sender {

and where you set the action to

[button1 addTarget:self action:@selector(goToFirstTrailer:) forControlEvents:....

Important is the colon after the message name because I changed the action method signature to include the sender.

Edit I wrote a small sample project with just an imageView in the MainWindow.xib and created a button programmatically as follows

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    // Override point for customization after application launch.

    UIButton *button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    button1.frame = CGRectMake(0.f, 0.f, 50.f, 50.f);
    [button1 setTitle:@"1" 
             forState:(UIControlState)UIControlStateNormal];
    [button1 addTarget:self
                action:@selector(goToFirstTrailer:) 
      forControlEvents:(UIControlEvents)UIControlEventTouchDown];
    imageView.userInteractionEnabled = YES; // <--- this has to be set to YES
    [imageView addSubview:button1];
    [self.window makeKeyAndVisible];

    return YES;
}

It is quick and dirty and yes, I am misusing the application delegate as the view controller. I know it is bad.

Here is the action method

- (void) goToFirstTrailer:(id)sender {
    imageView.backgroundColor = [UIColor redColor];
}

Setting the userInteractionEnabled property on the parent imageView makes the difference. With it set to NO which is the default, no events are routed to the button.

like image 69
GorillaPatch Avatar answered Oct 14 '22 01:10

GorillaPatch