Search code examples
iphoneiosios-4.2

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.


Solution

  • 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.