Objectif C: Envoi d'arguments pour une méthode appelée par un UIButton
J'ai une méthode qui est appelée lorsqu'un UIButton est cliqué. Quand j'ai créer le bouton je veux stocker un NSTimer comme argument.
C'est la minuterie et la création de la UIButton. Comment puis-je ajouter de la minuterie pour être envoyé à la méthode? J'ai essayé withObject:timer
, mais il me donne un avertissement et se bloque lors de l'exécution.
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:(0.009) target:self selector:@selector(moveStickFig:) userInfo:stickFig repeats:YES];
[stickFig addTarget:self action:@selector(tapFig:andTime:) forControlEvents:UIControlEventTouchUpInside];
C'est la méthode que je suis de l'envoyer à:
-(void) tapFig:(id)sender andTime:(NSTimer *)timer
J'ai aussi essayé de [stickFig performSelector:@selector(tapFig:andTime) withObject:nil withObject:timer]
après j'ai défini le UIButton, mais qui entraîne aussi un avertissement et se bloque.
OriginalL'auteur Chris | 2011-01-30
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas UIControl l'action des sélecteurs sont appelée sans paramètres, la commande qui est à la source de l'action, ou le contrôle qui est la source de l'action et de la UIEvent qui a eu lieu sur ce contrôle. Au bureau de l'IB, vous devez connecter le UIButton d'une telle méthode: vous ne pouvez pas ajouter d'autres paramètres personnalisés.
Si vous souhaitez avoir accès à d'autres objets, ils doivent être des variables d'instance.
Examen Apple Introduction à l'Objective-C si vous voulez comprendre comment définir les variables d'instance.
Il ya en fait trois signatures avec zéro, un ou deux paramètres pour les méthodes d'action.
OriginalL'auteur Phil Willoughby
Vous pouvez prendre l'approche d'étendre UIButton.
Alors votre méthode
Et de définir userInfo
Serait travailler pour vous?
OriginalL'auteur JP.
Modifier votre méthode pour prendre un seul
NSArray
comme argument. Ensuite, créez votre tableau de paramètres et passer àperformSelector
.Pour être plus clair:
Vous permettra de créer la
IBAction
requises pour le contrôle de l'événement et une deuxième méthode qui prend unNSArray
comme argument. Lorsque leIBAction
méthode est appelée, il ferait appel de la deuxième méthode après la création de laNSArray
de paramètres. Pensez à cela comme une "méthode de la chaîne."J'ai modifié ma réponse plus claire.
et où sur la terre serait la première méthode pour obtenir ces éléments de tableau? si la première méthode avait les arguments en quelque sorte, pour commencer (c'est tout l'intérêt de cette question), alors il n'aurait pas besoin de la deuxième méthode
OriginalL'auteur Evan Mulawski
Je suggère de créer une petite classe de soutien qui fonctionne comme un délégué qui prend simplement soin de la cliquez sur l'action pour vous, puis changer la cible de votre
addTarget
méthode.D'abord créer votre classe de soutien:
Puis changer de cible:
De cette façon, vous êtes en déléguant le clic de rappel à un autre objet. Ce cas est très simple (vous avez juste besoin de la NSTimer exemple), mais dans un scénario complexe il vous aide également à la conception de la logique de l'application par la délégation des choses différentes pour différentes classes de petite taille.
Espérons que cette aide!
Ciao
"il doit être conservé par le UIButton lorsque vous ajoutez la cible" Ce n'est pas vrai. Votre solution ne fonctionne pas.
Je vous remercie. C'est vrai, la cible n'est PAS conservé et qu'il doit être conservé par exemple dans une propriété. BTW, cela ne signifie pas que l'objectif de la solution ne fonctionne pas. Le champ d'application de la solution a été de déléguer la logique et de multiples paramètres d'un complexe bouton d'action à quelqu'un d'autre. Dans ce cas, il suffit de rejoindre le NSTimer le coût/bénéfice de l'ensemble de la délégation n'est pas vraiment utile, mais je pense que la logique est toujours valide.
si vous allez conserver le délégué à la propriété dans
self
, vous pouvez simplement conserver la minuterie lui-même en tant que propriété deself
, et de ne pas s'embêter avec la création de cette catégorie "extra" et tous les. aussi, vous avez toujours le problème de ne pas savoir quand la libération de cette propriété, sauf si vous savez combien de temps le bouton sera autour deComme je l'ai dit, c'est une approche et a l'intention d'ajouter plus de "trucs" dans la délégué (comme le NSTimer et plus de choses). Le bouton est la partie du contrôleur, vous pouvez conserver à la fois le bouton et le délégué en vie jusqu'à ce que la fonctionnalité est nécessaire. Définir la NSTimer que la propriété était tout à fait évident et déjà répondu. Je voulais essayer de mettre un autre point de vue. De toute façon, merci pour votre intelligente de soutien.
OriginalL'auteur lomanf
Vous avez besoin pour faire de la minuterie une propriété de votre point de vue contrôleur de gestion, puis de le référencer à partir de votre
tapFig:
méthode. Voici ce que votre code pourrait ressembler à:MainViewController.h
MainViewController.m
Avis de la
@property
déclaration dans le fichier d'en-tête. J'avais envisager de prendre un autre regard sur la minuterie de l'initialisation de trop, mais qui pourrait tout simplement être moi. J'espère que cela aide!Oups! Vous avez raison. C'est censé être un exemple de code, mais je l'ai modifié.
OriginalL'auteur Moshe
Vous pouvez créer des sous-classe de UIButton, ajouter une propriété dans la présente sous-classe, stocker vos objets dans cette propriété et le faire dans la méthode d'action par le biais de l'expéditeur.
OriginalL'auteur Igor