2009-07-06 8 views
2

J'ai une méthode qui accepte un expéditeur et est appelée avec un bouton d'interface utilisateur. Comment puis-je obtenir cet objet à casté dans un UIImageView? Fondamentalement, comment puis-je réutiliser le code pour le bouton.Paramètre d'expéditeur de diffusion

- (IBAction)startClick:(id)sender { 
    button.animationImages = [NSArray arrayWithObjects: 
             [UIImage imageNamed:@"Pic_1.png"], 
             [UIImage imageNamed:@"Pic_2.png"], 
             [UIImage imageNamed:@"Pic_3.png"], 
             nil]; 
    [button setAnimationRepeatCount:1]; 
    button.animationDuration = 1; 
    [button startAnimating]; 
} 
+0

Ceci est un doublon de votre question précédente: http: // stackoverflow.com/questions/1088481/sender-tag –

Répondre

3

Ma première réponse est que c'est probablement une erreur de le faire. UIButton et UIImageView sont des sous-classes distinctes de UIView (et UIButton est une sous-classe de UIControl) de sorte que les seules choses qu'ils ont en commun sont UIView méthodes. Si sender est vraiment un UIButton, le traiter comme UIImageView est susceptible d'entraîner des erreurs, telles que "sélecteur non reconnu envoyé à l'instance" et similaires.

En général, une solution plus propre consiste à créer une méthode distincte qui est l'action pour un UIImageView. (Contrairement à Java, Objective-C et Cocoa préfèrent ne pas pousser le code de réponse UI en une seule méthode basée sur le type d'événement - plutôt, vous organisez le code logiquement en fonction de l'opération à effectuer.)

Si vous devez appelez cette méthode à partir des deux boutons et des vues d'image, vous pouvez séparer la logique comme ceci:

- (IBAction) startClick:(id)sender { 
    if ([sender isKindOfClass:UIButton]) { 
    ... 
    } 
    else if ([sender isKindOfClass:UIImageView]) { 
    ... 
    } 
} 
+0

si je pouvais utiliser - (IBAction) je ne pourrais pas avoir posté ici :) mais le problème est que, ce bouton est dans la classe différente, je ne peux pas faire un IBAction pour cela dans cette classe – chostDevil

+0

Il devrait être " if ([sender isKindOfClass: [UIButton class]]) {...} ". Avec crochets et «classe» inclus. – Priebe

1

Je crois que vous auriez fait cela.

UIButton *button = (UIButton*) id; 
// then do all you button code here. 

Cela devrait fonctionner. Sinon, il peut être préférable de changer la fonction pour

(IBAction)startClick:(UIButton *)theButton 

De cette façon, vous voulez avoir à lancer le bouton.

+0

Cette dernière suggestion ne fonctionnera probablement pas. Les méthodes d'action IB ont toujours le type de retour "IBAction" (défini comme void) et le paramètre est de type id. –

1

Avez-vous une sortie pour votre bouton? Le bouton est-il le seul élément de l'interface utilisateur à envoyer -startClick:? Si oui, alors écrire la méthode d'action comme celui-ci:

- (IBAction)startClick:(id)sender { 
    NSParameterAssert(sender == self.startClickButton); 
    if (sender == self.startClickButton) { 
     UIButton *button = self.startClickButton; 
     [...] 
    } 
} 

Si vous ne disposez pas d'une sortie/propriété pour le bouton, vous pouvez tester la classe de l'expéditeur, et jeter le cas échéant. Enfin, il est permis (au moment de la compilation) d'envoyer n'importe quel message à une valeur typée d'identification. (Vous obtiendrez une exception à l'exécution si le destinataire ne répond pas à ce message.) Vous ne pouvez cependant pas utiliser la syntaxe à points. Par conséquent, si vous savez que l'expéditeur est toujours un bouton, vous pouvez écrire votre méthode sans aucune conversion. Vous devrez utiliser des messages envoyer la syntaxe au lieu de la syntaxe à points. Ceci est important à comprendre - la syntaxe de point est équivalente à la syntaxe d'envoi de message - ce n'est pas mystique.

0

Vous pouvez simplement utiliser les éléments suivants pour obtenir l'étiquette du bouton et déterminer lequel a été cliqué:

NSLog (@ "bouton cliquée:% @", [texte [expéditeur TitleLabel]]);

J'espère que cela aide.

Suresh

Questions connexes