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?

È stato utile?

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]);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top