Come passare una variabile a un'azione UIButton
Domanda
Ad esempio, voglio passare una variabile a un'azione UIButton
NSString *string=@"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.Come passare una variabile a un'azione UIButton?
Soluzione
Modificarlo 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.
Altri suggerimenti
Se è necessario distinguere tra più pulsanti, allora si potrebbe contrassegnare i pulsanti con le etichette in questo modo:
[downbutton addTarget:self action:@selector(buttonPress:) forControlEvents:UIControlEventTouchUpInside];
downButton.tag = 15;
Nel vostro metodo di azione delegato è quindi possibile gestire ogni tasto secondo la 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 *
È possibile utilizzare riferimenti associativi per aggiungere dati arbitrari al 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);
...
}
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. Ad 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
}
L'unico modo che ho trovato per fare questo è impostata una variabile di istanza prima di chiamare l'azione
Puoi estendere 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
Puoi impostare il tag del pulsante e accedervi dal mittente in azione
[btnHome addTarget:self action:@selector(btnMenuClicked:) forControlEvents:UIControlEventTouchUpInside];
btnHome.userInteractionEnabled = YES;
btnHome.tag = 123;
Nella funzione chiamata
-(void)btnMenuClicked:(id)sender
{
[sender tag];
if ([sender tag] == 123) {
// Do Anything
}
}
È possibile utilizzare le stringhe delle UIControlStates che dot'n uso:
NSString *string=@"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]);
}