2009-02-04 18 views
15

voglio passare una variabile ad un'azione UIButton, ad esempiocome passare una variabile ad un'azione UIButton

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

e la mia funzione di azione è come

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

Tuttavia, restituisce un Errore di sintassi. Qualcuno può mostrarmi come passare una variabile ad un'azione UIButton?

risposta

21

modifica per leggere:

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

non so circa l'Iphone SDK, ma l'obiettivo di un'azione tasto probabilmente riceve un id (di solito chiamato mittente).

- (void) buttonPress:(id)sender; 

All'interno della chiamata al metodo, il mittente dovrebbe essere il pulsante nel tuo caso, che consente di leggere le proprietà, come il suo nome, tag, ecc

1

L'unico modo che ho trovato per fare questo è impostare una variabile di istanza prima di chiamare l'azione

18

Se è necessario distinguere tra più pulsanti, allora si potrebbe contrassegnare i pulsanti con tag come questo:

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

Nella tua un Metodo ction delegato si può quindi gestire ogni pulsante in base alla sua tag precedentemente impostato:

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

UPDATE: sender.tag dovrebbe essere un NSInteger invece di un NSInteger *

6

È possibile utilizzare associative references per aggiungere dati arbitrari al vostro UIButton:

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

per il campo della politica (OBJC_ASSOCIATION_RETAIN) specificare il criterio appropriato per il vostro caso. Sul metodo di azione delegato:

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

Questo dovrebbe essere accettato come la risposta giusta. Si noti che questo richiede la seguente importazione: #import Inoltre, il collegamento è rotto: come di NOV 2016, il doc è: https://developer.apple.com/ reference/objectivec/1657527-objective_c_runtime – Gabriel

5

Un'altra opzione per il passaggio di variabili, che trovo ad essere più diretto rispetto al tag dalla risposta di Leviatan è quello di passare una stringa nel accessibilityHint.Per esempio:

button.accessibilityHint = [user objectId]; 

Poi nel metodo di azione del pulsante:

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

ottenendo (null) ... per favore suggeriscimi di ottenere la stringa esatta. –

0

È possibile impostare tag del pulsante e accedervi dal mittente in azione

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

Nella chiamata funzione

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

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

È possibile si estende UIButton e aggiungere una proprietà personalizzata

//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

È possibile utilizzare le stringhe delle UIControlStates che dot'n uso:

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

e la funzione di azione:

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