How to pass a variable to a UIButton action

前端 未结 8 1497
南笙
南笙 2020-12-13 21:05

I want to pass a variable to a UIButton action, for example

NSString *string=@\"one\";
[downbutton addTarget:self action:@selector(action1:string)
     forCo         


        
相关标签:
8条回答
  • 2020-12-13 21:11

    Change it to read:

    [downbutton addTarget:self action:@selector(action1:) forControlEvents:UIControlEventTouchUpInside];
    

    I don't know about the Iphone SDK, but the target of a button action probably receives an id (usually named sender).

    - (void) buttonPress:(id)sender;
    

    Within the method call, sender should be the button in your case, allowing you to read properties such as it's name, tag, etc.

    0 讨论(0)
  • 2020-12-13 21:12

    You can use the strings of the UIControlStates that you dot'n use:

    NSString *string=@"one";
    [downbutton setTitle:string forState:UIControlStateApplication];
    [downbutton addTarget:self action:@selector(action1:) forControlEvents:UIControlEventTouchUpInside];
    

    and the action function:

    -(void)action1:(UIButton*)sender{
        NSLog(@"My string: %@",[sender titleForState:UIControlStateApplication]);
    }
    
    0 讨论(0)
  • 2020-12-13 21:18

    The only way I've found to do this is set an instance variable before calling the action

    0 讨论(0)
  • 2020-12-13 21:19

    You can use associative references to add arbitrary data to your UIButton:

    static char myDataKey;
    ...
    UIButton *myButton = ...
    NSString *myData = @"This could be any object type";
    objc_setAssociatedObject (myButton, &myDataKey, myData, 
      OBJC_ASSOCIATION_RETAIN);
    

    For the policy field (OBJC_ASSOCIATION_RETAIN) specify the appropriate policy for your case. On the action delegate method:

    (void) buttonPress:(id)sender {
      NSString *myData =
        (NSString *)objc_getAssociatedObject(sender, &myDataKey);
      ...
    }
    
    0 讨论(0)
  • 2020-12-13 21:19

    You can set tag of the button and access it from sender in action

    [btnHome addTarget:self action:@selector(btnMenuClicked:)     forControlEvents:UIControlEventTouchUpInside];
                        btnHome.userInteractionEnabled = YES;
                        btnHome.tag = 123;
    

    In the called function

    -(void)btnMenuClicked:(id)sender
    {
    [sender tag];
    
        if ([sender tag] == 123) {
            // Do Anything
        }
    }
    
    0 讨论(0)
  • 2020-12-13 21:22

    If you need to distinguish between multiple buttons, then you could mark your buttons with tags like this:

    [downbutton addTarget:self action:@selector(buttonPress:) forControlEvents:UIControlEventTouchUpInside];
    downButton.tag = 15;
    

    In your action delegate method you can then handle each button according to its previously set tag:

    (void) buttonPress:(id)sender {
        NSInteger tid = ((UIControl *) sender).tag;
        if (tid == 15) {
            // deal with downButton event here ..
        }
        //...
    }
    

    UPDATE: sender.tag should be a NSInteger instead of a NSInteger *

    0 讨论(0)
提交回复
热议问题