2012-03-09 17 views
8

El valor de la etiqueta es un número entero:Cómo pasar una cadena como una etiqueta de UIButton

UIButton *button=[UIButton buttonWithType:UIButtonTypeCustom]; 
[button setTitle:addressField forState:UIControlStateNormal]; 
[button addTarget:self action:@selector(pickTheQuiz:) forControlEvents:UIControlEventTouchUpInside]; 
button.tag=1;//or what other integer value, i need to put a string value 

En el método del receptor:

-(void)pickTheQuiz:(id)sender{   
    NSLog(@"The part number is:%i",((UIControl*)sender).tag);//i need to receive a string value instead of numeric value 
} 
+1

* ¿Por qué * necesitas hacer eso? 'tag' es un número entero, por lo que no podrá establecer allí una cadena. Pero reitero: por favor díganos por qué necesita hacerlo, ya que es muy probable que haya una mejor solución. – mattjgalloway

+0

no se puede analizar el valor de cadena en la etiqueta – Hector

+0

ok, digamos que necesito pasar el valor 'addressField' cuando se presiona el botón. ¿Cómo puedo hacer eso? gracias por adelantado :) – Luca

Respuesta

11

Se puede convertir el valor entero de una etiqueta a una NSString con:

[NSString stringWithFormat:@"%i", ((UIControl*)sender).tag]; 

O, si realmente necesita una cadena como identificador para un objeto de interfaz de usuario, simplemente subclase y añadir una propiedad como:

@property (nonatomic, strong) NSString *stringID; 

Y luego úsala en lugar de usar la propiedad de la etiqueta.

0

NSLog (@ "El número de referencia es:% @", [NSString stringWithFormat: @ "% d", (UIControl *) remitente) .tag]);

0

por lo que sé las etiquetas siempre son de tipo int.

usted necesitará para convertir de forma manual como:

NSString *temp : [[NSString alloc]init]; 
if(sender.tag == x){ 
    temp = @"some string"; 
) 

y hacer que los casos de las diferentes etiquetas.

por favor, corríjanme si estoy mal aquí :)

0

tratar

-(void)pickTheQuiz:(id)sender{   
NSNumber *tag = [NSNumber numberWithInt:sender.tag]; 
    NSLog(@"The part number is:%@",[tag stringValue]); 
} 
1

La propiedad etiqueta solo acepta números enteros, y si la piratería el valor entero para llegar a una cadena no es una opción para usted , puede subclasificar el UIButton y luego usar la sección Atributos de tiempo de ejecución definida por el usuario en IB para establecer el valor de la propiedad en su StoryBoard.

Subclase el UIButton con una nueva propiedad no entero:

@interface MyCustomUIButton : UIButton 

@property (strong) NSString* stringTag; 

@end 

Establecer la clase de su botón a la sub-clase:

inspector de Identidad> Clase encargo> class = > MyCustomUIButton

Establezca el valor de propiedad para m IB o por medio de código:

De IB:

inspector de Identidad> Tiempo de ejecución definido por el usuario Atributos:

tecla PATH => stringTag

Tipo => Cadena

Valor = > yourstringvalue

O F Código rom:

((MyCustomUIButton*)yourButton).stringTag = @"yourstringvalue"; 

A continuación, se puede recuperar el valor de la propiedad de su método de acción del botón:

-(void)yourMethod:(id)sender 
    {   
    NSLog(@"The string value is: ",((MyCustomUIButton*)sender).stringTag); 

    // or use this idiom, to avoid a possible crash if it's the wrong class: 

    if ([sender respondsToSelector:@selector(stringTag)]) 
      testeee = [sender valueForKey:@"stringTag"]; 
    else 
      NSLog(@"this IS NOT a MyCustomUIButton, it's a plain UIButton"); 

    // testeee will be NULL if you FORGOT to set the 
    // User Defined Runtime Attribute for 'stringTag' in storyboard 

    // note that a useful alternative to 
    // if ([sender respondsToSelector:@selector(stringTag)]) 
    // is... 
    // if ([sender respondsToSelector:NSSelectorFromString(@"stringTag")]) 
    } 
+0

Hiya Justas! Para que quede claro, DEBE USAR una clase personalizada, ¿es correcto Justas? No se puede simplemente configurar un "Atributo de tiempo de ejecución definido por el usuario" a alguna clave/valor, y luego recogerlo usando valueForKey - ¿correcto? ¡Gracias! – Fattie

+0

BTW Creo que necesitas el atributo (fuerte) o ese imbécil se bloqueará ... – Fattie

0

No es una manera simple para pasar un parámetro NSString con UIButton es decir, justo conjunto de títulos de buuton con un color claro y un tamaño de letra 0.0f. Esto es válido si usa una imagen ([button setBackgroundImage: anyImage. forState: UIControlStateNormal];) en el botón y no muestra la titl y entonces se puede obtener "sender.currentTitle" y utilizar esta variable

6

Usted puede hacer eso abajo con la ayuda de la función objc_runtime

#import <objc/runtime.h> 

static char kButtonAssociatedKey; 

NSString *aStrKey = [NSString stringWithFormat:@"Any Key"]; 
UIButton *button=[UIButton buttonWithType:UIButtonTypeCustom]; 
[button setTitle:addressField forState:UIControlStateNormal]; 
[button addTarget:self action:@selector(pickTheQuiz:) forControlEvents:UIControlEventTouchUpInside]; 
button.tag=1; 

objc_setAssociatedObject(button, 
         &kButtonAssociatedKey, 
         aStrKey, 
         OBJC_ASSOCIATION_RETAIN_NONATOMIC); 

-(void)pickTheQuiz:(id)sender 
{ 
    NSString *aStrKey = objc_getAssociatedObject(sender, &kButtonAssociatedKey); 
    objc_removeAssociatedObjects(sender); 
    NSLog(@"%@", aStrKey); 
} 
+1

Esta debería ser la respuesta aceptada. Lástima que Apple no haya agregado esto como un método en NSObject –

+1

Muchas gracias. Esta es la mejor respuesta para esta pregunta. – Kishore

Cuestiones relacionadas