iphone - color - cómo pasar una variable a una acción UIButton
menu ios (8)
Cámbielo para leer:
[downbutton addTarget:self action:@selector(action1:) forControlEvents:UIControlEventTouchUpInside];
No sé sobre el SDK de Iphone, pero el objetivo de una acción de botón probablemente reciba una identificación (normalmente el remitente designado).
- (void) buttonPress:(id)sender;
Dentro de la llamada al método, el remitente debe ser el botón en su caso, lo que le permite leer propiedades como su nombre, etiqueta, etc.
Quiero pasar una variable a una acción UIButton, por ejemplo
NSString *string=@"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 un error de sintaxis. ¿Puede alguien mostrarme cómo pasar una variable a una acción UIButton?
La única forma que he encontrado para hacer esto es establecer una variable de instancia antes de llamar a la acción
Si necesita distinguir entre varios botones, puede marcar sus botones con etiquetas como esta:
[downbutton addTarget:self action:@selector(buttonPress:) forControlEvents:UIControlEventTouchUpInside];
downButton.tag = 15;
En su método delegado de acción, puede manejar cada botón de acuerdo con su etiqueta establecida previamente:
(void) buttonPress:(id)sender {
NSInteger tid = ((UIControl *) sender).tag;
if (tid == 15) {
// deal with downButton event here ..
}
//...
}
ACTUALIZACIÓN: sender.tag debe ser un NSInteger
lugar de un NSInteger *
Puede usar referencias asociativas 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 campo de política (OBJC_ASSOCIATION_RETAIN), especifique la política adecuada para su caso. En el método delegado de acción:
(void) buttonPress:(id)sender {
NSString *myData =
(NSString *)objc_getAssociatedObject(sender, &myDataKey);
...
}
Otra opción para pasar variables, que me parece que es más directo que la etiqueta de la respuesta de Leviatan, es pasar una cadena en 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
}
Puede establecer la etiqueta del botón y acceder desde el remitente en acción
[btnHome addTarget:self action:@selector(btnMenuClicked:) forControlEvents:UIControlEventTouchUpInside];
btnHome.userInteractionEnabled = YES;
btnHome.tag = 123;
En la función llamada
-(void)btnMenuClicked:(id)sender
{
[sender tag];
if ([sender tag] == 123) {
// Do Anything
}
}
Puede extender UIButton y agregar 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
Puede usar las cadenas de los UIControlStates que no utiliza:
NSString *string=@"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]);
}