2009-02-04 14 views
15

Quiero pasar una variable a una acción UIButton, por ejemplocómo pasar una variable a una acción UIButton

NSString *[email protected]"one"; 
[downbutton addTarget:self action:@selector(action1:string) 
    forControlEvents:UIControlEventTouchUpInside]; 

y mi función de acción es como

-(void) action1:(NSString *)string{ 
} 

Sin embargo, devuelve una error de sintaxis. ¿Puede alguien mostrarme cómo pasar una variable a una acción UIButton?

Respuesta

21

cambio que se lea:

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

no sé sobre el SDK Iphone, pero el objetivo de una acción del botón probablemente recibe un ID (normalmente llamado remitente).

- (void) buttonPress:(id)sender; 

Dentro de la llamada al método, el remitente debe ser el botón en su caso, que le permite leer las propiedades tales como su nombre, etiqueta, etc.

1

La única manera que he encontrado para hacer esto es establecer una variable de instancia antes de llamar a la acción

18

Si es necesario distinguir entre varios botones, entonces se podría marcar sus botones con etiquetas como esta:

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

En su una cción método delegado a continuación, puede manejar cada botón según su etiqueta previamente establecido:

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

ACTUALIZACIÓN: sender.tag debería haber un NSInteger en lugar de un NSInteger *

6

Puede utilizar associative references para agregar datos arbitrarios a su UIButton:

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

para el ámbito de la política (OBJC_ASSOCIATION_RETAIN) especifica la política adecuada para su caso. En el método de acción delegado:

(void) buttonPress:(id)sender { 
    NSString *myData = 
    (NSString *)objc_getAssociatedObject(sender, &myDataKey); 
    ... 
} 
+0

Esto debería ser aceptado como la respuesta correcta. Tenga en cuenta que esto requiere la siguiente importación: import Además, se rompe el vínculo: como del NoV 2016, el documento es: https://developer.apple.com/ reference/objectivec/1657527-objective_c_runtime – Gabriel

5

Otra opción para pasar variables, que me parece ser más directa que la etiqueta de la respuesta de Leviatan es pasar una cadena en el accessibilityHint.Por ejemplo:

button.accessibilityHint = [user objectId]; 

Luego, en el método de acción del botón:

-(void) someAction:(id) sender { 
    UIButton *temp = (UIButton*) sender; 
    NSString *variable = temp.accessibilityHint; 
    // anything you want to do with this variable 
} 
+0

obteniendo (nulo) ... por favor sugiérame para obtener una cadena exacta. –

0

Es posible ajustar la etiqueta del botón y acceder a ella desde el emisor en la acción

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

En la llamada función

-(void)btnMenuClicked:(id)sender 
{ 
[sender tag]; 

    if ([sender tag] == 123) { 
     // Do Anything 
    } 
} 
1

Usted puede se extiende UIButton y añadir una propiedad personalizada

//UIButtonDictionary.h 
#import <UIKit/UIKit.h> 

@interface UIButtonDictionary : UIButton 

@property(nonatomic, strong) NSMutableDictionary* attributes; 

@end 

//UIButtonDictionary.m 
#import "UIButtonDictionary.h" 

@implementation UIButtonDictionary 
@synthesize attributes; 

@end 
0

Puede usar las cuerdas de las UIControlStates que Dot'n uso:

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

y la función de acción:

-(void)action1:(UIButton*)sender{ 
    NSLog(@"My string: %@",[sender titleForState:UIControlStateApplication]); 
} 
Cuestiones relacionadas