2010-03-03 6 views
1

- (void) displayNameBy: (NSString *) Nom {@selector mot clé dans la programmation iPhone

mylable.text = name; 

} 

je veux appeler cette méthode en utilisant les mots-clés @selector.

par exemple:

[MyButton addTarget:self action:***@selector(displayNameBy:name)*** forControlEvents:UIControlEventTouchUpInside]; 

Ici italiques gras est mon doute .. pourrais-je passer le paramètre de nom d'ici. quand j'essaye de passer la valeur de nom j'obtiens l'erreur.

n'importe quel moyen d'obtenir la valeur du nom dans la méthode displayNameBy: name. en utilisant les mots-clés @selector.

ici MyButton que j'ai créé par programmation. pas dans le constructeur de l'interface.

Merci et salutations

Répondre

1

sélecteur de la méthode est juste displayNameBy:. Le name la fin est le nom du paramètre. Cependant, je ne sais pas d'où vous attendez ce paramètre NSString *name. L'argument pour une méthode d'action est l'expéditeur, qui sera le bouton dans ce cas. Ce serait donc - (void)displayNameBy:(id)sender.

Si vous essayez de transmettre le paramètre via le sélecteur, cela n'est pas possible. Un sélecteur est littéralement juste un nom - il ne spécifie aucun comportement particulier.

Si vous voulez utiliser PLBlocks, vous pouvez créer une classe de trampoline qui serait appelé comme:

[myButton setTarget:[BlockProxy proxyWithBlock:^{ [self displayNameBy:name]; }] action:@selector(call:) forControlEvents:UIControlEventTouchUpInside]; 

C'est le plus proche vous aurez, je pense. Parce que ce que vous voulez vraiment, c'est que le bouton appelle une fermeture, ce que PLBlocks vous donne. Que cela vaille la peine d'obtenir ce genre d'expressivité, c'est ce que vous appelez.

+1

Merci, je vois ceci, "(void) displayNameBy: (id) expéditeur", mais je veux obtenir la valeur du nom ici, y at-il un moyen d'y arriver. ? – jaleel

4

Avoir une méthode intermédiaire. comme:

{ 
    ... 
    [MyButton addTarget:self action:@selector(displayName) forControlEvents:UIControlEventTouchUpInside]; 
    ... 
} 

-(void) displayName 
{ 
    [self performSelector:@selector(displayNameBy:) withObject:@"name"]; 
} 

-(void)displayNameBy:(NSString*)name{ 

    mylable.text = name; 

} 
2

Si vous créez un sélecteur à un argument pour votre action (comme vous faites dans displayNameBy:), l'argument est l'expéditeur de l'action. Dans ce cas, votre instance de bouton.

Selon le UIControl docs, il y a trois différents types de sélecteurs pris en charge:

- (void)action 
- (void)action:(id)sender 
- (void)action:(id)sender forEvent:(UIEvent *)event 

Où vous attendez-vous name à définir? Est-ce basé sur les actions de l'utilisateur, l'état de l'application ou autre chose? Selon la méthode utilisée, vous pouvez créer une sous-classe UIButton qui inclut la logique nécessaire ou déclare un protocole de délégué, définissez le délégué sur votre contrôleur de vue et demandez à l'implémentation de délégué de définir l'étiquette du bouton. Ce dernier est probablement meilleur d'un point de vue MVC, à moins que la source de name soit simplement aveuglante (c'est-à-dire, un attribut qui pourrait être défini sur le bouton, pas quelque chose que le bouton devrait calculer en fonction d'un autre état d'application).