2009-01-16 18 views
10

Tengo el siguiente código:¿Cómo puedo pasar un parámetro a esta función?

[replyAllBtn addTarget:self.target action:@selector(ReplyAll:) forControlEvents:UIControlEventTouchUpInside]; 

- (void)replyAll:(NSInteger)tid { 
// some code 
} 

¿Cómo puedo enviar un parámetro a la función ReplyAll?

Respuesta

21

El método replyAll debe aceptar el remitente (id). Si un UIButton disparó el evento, entonces ese mismo UIButton se pasará como el remitente. UIButton tiene una "etiqueta" de propiedad a la que puede adjuntar sus propios datos personalizados (al igual que las formas de pago .net).

Así que es conectar su evento con:

[replyAllBtn addTarget:self.target action:@selector(ReplyAll:) forControlEvents:UIControlEventTouchUpInside]; 
replyAllBtn.tag=15; 

luego manejarlo con:

(void) ReplyAll:(id)sender{ 
    NSInteger *tid = ((UIControl*)sender).tag; 
    //... 
+0

bueno, esto es exactamente lo que quería ... añadiendo la etiqueta funciona bien, pero en el controlador, donde se define la función responseAll { NSInteger * tid = (* NSInteger) sender.tag; } da un error que dice "solicitud de etiqueta miembro en algo que no es una estructura o unión" :( – Vijayeta

+1

Gracias por aclarar esto, Rob. Yo estaba tratando de averiguar exactamente cómo iba a lograr el mismo comportamiento Vijayeta estaba buscando. @Vijayeta: El remitente es el botón en sí, así que creo que debe probar "((UIControl *) remitente) .tag;". Tenga en cuenta que debe encerrar el objeto entre paréntesis antes de poder acceder al propiedad de etiqueta. – LucasTizma

+1

@Vijayeta: '.tag' es un número entero, no un puntero a un número entero.' NSInteget tid = sender.tag' – user102008

1

El modelo MVC utilizado en Cocoa funciona de manera diferente. Básicamente, la idea es que un control (= vista) como un botón solo permita que una función sepa que se presionó, sin saber lo que esto significa. La función debe conocer todas las dinámicas y dependencias. En tu caso, es la función la que tiene que encontrar el parámetro. Para lograr eso, "vinculará" otros objetos a la función (= controlador).

Le sugiero que lea algunos tutoriales de Cocoa primero si quiere avanzar con la programación de iPhone.

2

una función del selector se definirán como tal:

- (void) ReplyAll:(id)sender; 

Así que el único parámetro de una acción nunca se recibe es el control real que lo llamó. Puede agregar una propiedad a su control que se puede leer en respuesta. Todos

+0

Hii, Gracias por la pronta respuesta, una duda que tengo es THT, ya que el control es una instancia de UIButton, ¿Cómo puedo añadir cualquier propiedad a ella ??? Puede ser que la pregunta es ingenua ... pero realmente no lo entiendo. – Vijayeta

0

Hay algunas buenas maneras de hacerlo. Los dos más comúnmente implementados serían tener al controlador (quién recibe la acción) conocer a los posibles remitentes, o hacer que el remitente tenga un método que termine usando para determinar el comportamiento adecuado.

La primera (mi manera preferible, pero es fácil argumentar lo contrario) se implementarían como tales:

@interface Controller : NSObject { 
    UIButton *_replyToSender; 
    UIButton *_replyToAll; 
} 
- (void)buttonClicked:(id)sender; 
@end 

@implementation Controller 
- (void)buttonClicked:(id)sender { 
    if (sender == _replyToSender) { 
     // reply to sender... 
    } else if (sender == _replyToAll) { 
     // reply to all... 
    } 
} 
@end 

La segunda manera se llevaría a cabo de tal manera que:

typedef enum { 
    ReplyButtonTypeSender = 1, 
    ReplyButtonTypeAll, 
} ReplyButtonType; 

@interface Controller : NSObject { 
} 
- (void)buttonClicked:(id)sender; 
@end 

@interface MyButton : UIButton { 
} 
- (ReplyButtonType)typeOfReply; 
@end 

@implementation Controller 
- (void)buttonClicked:(id)sender { 
    // You aren't actually assured that sender is a MyButton, so the safest thing 
    // to do here is to check that it is one. 
    if ([sender isKindOfClass:[MyButton class]]) { 
     switch ([sender typeOfReply]) { 
      case ReplyButtonTypeSender: 
       // reply to sender... 
       break; 
      case ReplyButtonTypeAll: 
       // reply to all... 
       break; 
     } 
    } 
} 
@end 
2

Si desea enviar un valor int, establecer la etiqueta de tecla = la int valor que quieres pasar Luego puede acceder al valor de la etiqueta del botón para obtener la int que desea.

NSInteger no es un puntero. Pruebe esto

NSInteger tid = sender.tag; 
+0

lo he intentado a sí mismo pero el error no se refiere al tipo de objeto, es no obteniendo el tipo del remitente. Eso es y el error dice "solicitud de memb er etiqueta en algo que no es una estructura o unión " – Vijayeta

+0

¿El remitente es un objeto de una clase personalizada que ha declarado? En ese caso pruebe con [remitente etiqueta] en lugar de sender.tag. Eso usualmente funciona. – lostInTransit

+0

sí, lo he probado y wrks .. gracias – Vijayeta

2

Está trabajando ahora: D.

{ 
NSInteger tid = [sender tag]; 
} 
Cuestiones relacionadas