J'utilise addTarget: action: forControlEvents comme ceci:
[newsButton addTarget:self
action:@selector(switchToNewsDetails)
forControlEvents:UIControlEventTouchUpInside];
et je voudrais passer des paramètres à mon sélecteur "switchToNewsDetails". La seule chose que je réussis à faire est de passer l'expéditeur (id) en écrivant:
action:@selector(switchToNewsDetails:)
Mais j'essaye de passer des variables comme des valeurs entières. L'écrire de cette façon ne fonctionne pas:
int i = 0;
[newsButton addTarget:self
action:@selector(switchToNewsDetails:i)
forControlEvents:UIControlEventTouchUpInside];
L'écrire de cette façon ne fonctionne pas non plus:
int i = 0;
[newsButton addTarget:self
action:@selector(switchToNewsDetails:i:)
forControlEvents:UIControlEventTouchUpInside];
Toute aide serait appréciée :)
ios
objective-c
iphone
cocoa-touch
uicontrolevents
Pierre Espenan
la source
la source
Réponses:
Vous ne passez pas de paramètres à la
switchToNewsDetails:
méthode ici. Vous venez de créer un sélecteur pour rendre le bouton capable de l'appeler lorsque certaines actions se produisent (retouchez dans votre cas). Les contrôles peuvent utiliser 3 types de sélecteurs pour répondre aux actions, tous ont une signification prédéfinie de leurs paramètres:sans paramètres
avec 1 paramètre indiquant le contrôle qui envoie le message
Avec 2 paramètres indiquant le contrôle qui envoie le message et l'événement qui a déclenché le message:
Ce que vous essayez de faire n'est pas clair, mais étant donné que vous souhaitez attribuer un index de détails spécifique à chaque bouton, vous pouvez effectuer les opérations suivantes:
dans la
switchToNewsDetails:
méthode, vous pouvez obtenir cet index et ouvrir les détails appropriés:la source
[button.layer setValue:yourObject forKey:@"anyKey"];
, puis dans la méthode, vérifiez simplement(objectClass *)[button.layer valueForKey:@"anyKey"];
C'est comme une version plus gratuite de.tag
Pour transmettre des paramètres personnalisés avec le bouton cliquez, il vous suffit de sous- classer UIButton .
(ASR est activé, il n'y a donc pas de version dans le code.)
C'est myButton.h
C'est myButton.m
Usage:
Fonction de réception:
Si vous avez besoin que je sois plus précis sur une partie du code ci-dessus, n'hésitez pas à le poser dans les commentaires.
la source
tag
propriété dans les vues Android . Ils peuvent stocker n'importe quel objet. Et vous pouvez également stocker des objets par clé comme dans un dictionnaire / carte.Target-Action permet trois formes différentes de sélecteur d'action:
la source
Besoin de plus qu'un simple (int) via .tag? Utilisez KVC!
Vous pouvez transmettre toutes les données souhaitées via l'objet bouton lui-même (en accédant à CALayers keyValue dict).
Définissez votre objectif comme ceci (avec le ":")
Ajoutez vos données au bouton lui-même (ainsi que celui
.layer
du bouton) comme ceci:Ensuite, lorsque vous appuyez sur le bouton, vous pouvez le vérifier comme ceci:
la source
J'ai fait une solution basée en partie sur les informations ci-dessus. Je viens de définir le titlelabel.text sur la chaîne que je veux passer, et de définir le titlelabel.hidden = YES
Comme ça :
De cette façon, il n'y a pas besoin d'héritage ou de catégorie et il n'y a pas de fuite de mémoire
la source
Je créais plusieurs boutons pour chaque numéro de téléphone dans un tableau de sorte que chaque bouton avait besoin d'un numéro de téléphone différent pour appeler. J'ai utilisé la fonction setTag car je créais plusieurs boutons dans une boucle for:
Ensuite, dans mon appel: méthode, j'ai utilisé la même boucle for et une instruction if pour choisir le bon numéro de téléphone:
la source
- (void)call:(UIButton *)sender { NSString *phoneNumber = _phoneNumbers[i]; NSString *callString = [NSString stringWithFormat:@"telprompt://%@", phoneNumber]; [[UIApplication sharedApplication] openURL:[NSURL URLWithString:callString]]; }
Comme il existe de nombreuses façons mentionnées ici pour la solution, sauf la fonction de catégorie.
Par exemple (ex):
dans votre vue Controller.m
Gestionnaire d'événements:
la source
Vous pouvez remplacer l'action-cible par une fermeture (bloc en Objective-C) en ajoutant un wrapper de fermeture d'assistance (ClosureSleeve) et en l'ajoutant en tant qu'objet associé au contrôle afin qu'il soit conservé. De cette façon, vous pouvez passer tous les paramètres.
Swift 3
Usage:
la source
self.switchToNewsDetails(parameter: i)
) tirant 2 fois, pourquoi m'aiderbutton.addAction()
deux fois. Ajoutez un point d'arrêt àbutton.addAction
et également sur la première ligne à l'intérieur de la fermeture et essayez de le déboguer vous-même.Il existe un autre moyen, dans lequel vous pouvez obtenir indexPath de la cellule où votre bouton a été enfoncé:
en utilisant un sélecteur d'action habituel comme:
puis dans votre fonction:
puisque vous obtenez un indexPath, il est devenu beaucoup plus simple.
la source
Voir mon commentaire ci-dessus, et je pense que vous devez utiliser NSInvocation lorsqu'il y a plus d'un paramètre
plus d'informations sur NSInvocation ici
http://cocoawithlove.com/2008/03/construct-nsinvocation-for-any-message.html
la source
Cela a résolu mon problème mais il s'est écrasé à moins que je ne change
à
la source
J'ai sous-classé UIButton dans CustomButton et j'ajoute une propriété où je stocke mes données. J'appelle donc method: (CustomButton *) sender et dans la méthode je ne lis que mes données sender.myproperty.
Exemple CustomButton:
Action de la méthode:
Attribuer une action
la source
Si vous souhaitez simplement modifier le texte du leftBarButtonItem affiché par le contrôleur de navigation avec la nouvelle vue, vous pouvez modifier le titre de la vue actuelle juste avant d'appeler pushViewController au texte souhaité et le restaurer dans le rappel viewHasDisappered pour les futures expositions de la vue actuelle.
Cette approche conserve la fonctionnalité (popViewController) et l'apparence de la flèche affichée intacts.
Cela fonctionne pour nous au moins avec iOS 12, construit avec Xcode 10.1 ...
la source