Erreur «sélecteur non reconnu envoyé à l’instance» dans Objective-C

J’ai créé un bouton et ajouté une action pour cela, mais dès qu’il a été invoqué, j’ai eu cette erreur:

-[NSCFDictionary numberButtonClick:]: unrecognized selector sent to instance 0x3d03ac0 2010-03-16 22:23:58.811 Money[8056:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason:'*** -[NSCFDictionary numberButtonClick:]: unrecognized selector sent to instance 0x3d03ac0' 

Ceci est mon code:

 - (id)initWithNibName:(NSSsortingng *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) { UIButton *numberButton = [UIButton buttonWithType:UIButtonTypeCustom]; numberButton.frame = CGRectMake(10, 435, 46, 38); [numberButton setImage:[UIImage imageNamed:@"one.png"] forState:UIControlStateNormal]; [numberButton addTarget:self action:@selector(numberButtonClick:) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview: numberButton]; } return self; } -(IBAction)numberButtonClick:(id)sender{ NSLog(@"---"); } 

Il semble que vous ne gérez pas correctement le contrôleur de vue et qu’il soit désalloué à un moment donné – ce qui entraîne l’ numberButtonClicked: méthode numberButtonClicked: à un autre object occupant la mémoire numberButtonClicked: précédemment par le contrôleur de vue …

Assurez-vous de conserver / libérer correctement votre contrôleur de vue.

Pour ceux qui arrivent ici via Google, comme je l’ai fait, cela concerne probablement plus Xcode 4.2 + / iOS 5+ et plus, avec ARC. J’ai eu la même erreur ” sélecteur non reconnu envoyé à l’instance “. Dans mon cas, j’avais une action cible UIButton configurée pour se transmettre en tant que paramètre de l’expéditeur, mais je me suis rendu compte plus tard que je n’en avais pas besoin et que je l’ai supprimée dans le code. Donc, quelque chose comme:

 - (IBAction)buttonPressed:(UIButton *)sender { 

A été changé pour:

 - (IBAction)buttonPressed { 

Un clic droit sur le bouton UIButton en question a montré que l’événement Touch Up Inside était associé au bouton control controller ViewPressed:. Enlever ceci et le réassigner à la méthode modifiée a fonctionné un traitement.

C’était la meilleure réponse de Google pour ce problème, mais j’avais une cause / un résultat différent – je pensais append mes deux cents au cas où d’autres rencontreraient ce problème.

J’ai eu un problème similaire ce matin. J’ai constaté que si vous cliquez avec le bouton droit sur l’élément de l’interface utilisateur vous donnant le problème, vous pouvez voir quelles connexions ont été créées. Dans mon cas, j’ai eu un bouton câblé à deux actions. J’ai supprimé les actions du menu contextuel et les re-câblé pour résoudre mon problème.

Donc, assurez-vous que vos actions sont bien connectées.

OK, je dois entrer ici. L’OP a créé dynamicment le bouton . J’ai eu un problème similaire et la réponse (après des heures de chasse) est si simple que ça m’a rendu malade.

En utilisant:

 action:@selector(xxxButtonClick:) or (as in my case) action:NSSelectorFromSsortingng([[NSSsortingng alloc] initWithFormat:@"%@BtnTui:", name.lowercaseSsortingng]) 

Si vous placez un deux-points à la fin de la chaîne – il passera à l’expéditeur. Si vous ne placez pas les deux points à la fin de la chaîne, ce ne sera pas le cas et le destinataire recevra une erreur s’il en attend une. Il est facile de manquer les deux points si vous créez dynamicment le nom de l’événement.

Les options de code du récepteur ressemblent à ceci:

 - (void)doneBtnTui:(id)sender { NSLog(@"Done Button - with sender"); } or - (void)doneBtnTui { NSLog(@"Done Button - no sender"); } 

Comme d’habitude, c’est toujours la réponse évidente qui est manquée.

Dans mon cas, la fonction n’attendait pas d’argument mais le bouton était configuré pour en envoyer un provoquant l’erreur. Pour résoudre ce problème, j’ai dû recâbler le gestionnaire d’événements.

Voici ma fonction:

entrer la description de l'image ici

Notez qu’il ne contient aucun argument.

Voici une image de la configuration de mon bouton (clic droit sur le bouton pour l’afficher):

entrer la description de l'image ici

Notez qu’il y a 3 gestionnaires d’événements.

Pour résoudre ce problème, j’ai dû supprimer chacun des éléments de l’événement, car l’un d’eux envoyait une référence à la fonction enterPressed. Pour supprimer ces éléments, j’ai cliqué sur la petite icône x à côté du nom de chaque élément jusqu’à ce qu’il n’y ait plus d’éléments affichés.

entrer la description de l'image ici

Ensuite, j’ai dû reconnecter le bouton à l’événement. Pour ce faire, maintenez la touche Contrôle enfoncée, puis faites glisser une ligne du bouton vers l’action. Il devrait dire “Connect Action”. Remarque: j’ai dû redémarrer XCode pour que cela fonctionne pour une raison quelconque; sinon, il me laisse seulement insérer des actions (aka créer une nouvelle action) au-dessus ou au-dessous de la fonction.

entrer la description de l'image ici

Vous devriez maintenant avoir un gestionnaire d’événements unique connecté à l’événement bouton qui ne transmet aucun argument:

entrer la description de l'image ici

Cette réponse complète la réponse de @Leonard Challis que vous devriez lire également.

Cela peut également se produire si vous ne définissez pas la “Classe” de la vue dans le générateur d’interface.

Dans mon cas, j’utilisais NSNotificationCenter et essayais d’utiliser un sélecteur qui ne prenait aucun argument, mais ajoutait un deux-points. Enlever les deux points corrige le problème.

Si vous utilisez un nom de sélecteur, n’utilisez pas de deux-points s’il n’y a pas d’argument. S’il y a un argument, utilisez un deux-points final. S’il y a plus d’un argument, vous devez les nommer avec un deux-points de fin pour chaque argument.

Voir la réponse d’Adam Rosenfield ici: Sélecteurs dans l’objective C

J’ai eu ce problème avec un projet Swift où je crée les boutons dynamicment. Code de problème:

 var trashBarButtonItem: UIBarButtonItem { return UIBarButtonItem(barButtonSystemItem: .Add, target: self, action: "newButtonClicked") } func newButtonClicked(barButtonItem: UIBarButtonItem) { NSLog("A bar button item on the default toolbar was clicked: \(barButtonItem).") } 

La solution consistait à append un deux-points complet «:» après l’action: par exemple

 var trashBarButtonItem: UIBarButtonItem { return UIBarButtonItem(barButtonSystemItem: .Add, target: self, action: "newButtonClicked:") } func newButtonClicked(barButtonItem: UIBarButtonItem) { NSLog("A bar button item on the default toolbar was clicked: \(barButtonItem).") } 

Exemple complet ici: https://developer.apple.com/library/content/samplecode/UICatalog/Listings/Swift_UIKitCatalog_DefaultToolbarViewController_swift.html

La cause la plus évidente (incluse pour être complet) est de lancer un pointeur et d’appeler une méthode de la mauvaise classe.

 NSArray* array = [[NSArray alloc] init]; [(NSDictionary*)array objectForKey: key]; // array is not a dictionary, hence exception 

J’ai eu un problème similaire, mais pour moi la solution était légèrement différente. Dans mon cas, j’ai utilisé une catégorie pour étendre une classe existante (UIImage pour certaines capacités de redimensionnement – voir ce guide au cas où cela vous intéresse) et j’ai oublié d’append le fichier * .m à la cible de génération. Erreur stupide, mais pas toujours évidente quand il arrive où regarder. Je pensais que ça valait la peine de partager …

J’ai eu la même erreur et j’ai découvert ce qui suit:

Lorsque vous utilisez le code

 [self.refreshControl addTarget:self action:@selector(yourRefreshMethod:) forControlEvents:UIControlEventValueChanged]; 

Vous pensez peut-être qu’il cherche le sélecteur:

 - (void)yourRefreshMethod{ (your code here) } 

Mais il cherche en fait le sélecteur:

 - (void)yourRefreshMethod:(id)sender{ (your code here) } 

Ce sélecteur n’existe pas, vous obtenez donc le crash.

Vous pouvez modifier le sélecteur pour recevoir l’expéditeur (id) afin de résoudre l’erreur.

Mais que faire si vous avez d’autres fonctions qui appellent la fonction de rafraîchissement sans fournir d’expéditeur? Vous avez besoin d’une fonction qui fonctionne pour les deux. La solution facile consiste à append une autre fonction:

 - (void)yourRefreshMethodWithSender:(id)sender{ [self yourRefreshMethod]; } 

Et puis modifiez le code de mise à jour d’actualisation pour appeler ce sélecteur à la place:

 [self.refreshControl addTarget:self action:@selector(yourRefreshMethodWithSender:) forControlEvents:UIControlEventValueChanged]; 

Je suis également en train de suivre le cours iOS de Stanford sur un ancien Mac qui ne peut pas être mis à niveau vers la dernière version de Mac OSX. Donc, je continue à construire pour iOS 6.1, et cela a résolu le problème pour moi.

Je pense que vous devriez utiliser le vide, au lieu du type IBAction en retour. parce que vous avez défini un bouton par programmation.

J’ai aussi eu le même problème.

J’ai supprimé mon uibutton dans mon storyboard et l’ai recréé .. maintenant tout fonctionne bien.

J’apprends actuellement le développement iOS et je passe en revue le livre “Beginning iOS6 Development” par aPress. Je recevais la même erreur au chapitre 10: Storyboards.

Il m’a fallu deux jours pour le comprendre, mais j’ai découvert que j’avais accidentellement défini le tag de la cellule TableView sur 1 alors que je n’aurais pas dû. Pour quiconque fait ce livre et reçoit une erreur similaire, j’espère que cela vous aidera.

J’espère vraiment que les erreurs futures dans mon code seront plus faciles à trouver! hahaha. L’erreur de débogage n’a rien fait pour me convaincre (ou du moins je suis trop nouveau pour comprendre le débogueur, lol).

Dans mon cas, j’utilisais un UIWebView et j’ai passé un NSSsortingng dans le second paramètre au lieu d’un NSURL. Je soupçonne donc que des types de classe erronés transmis à une fonction peuvent provoquer cette erreur.

..Et maintenant le mien

J’avais le bouton lié à une méthode qui accédait au paramètre d’un autre bouton et ça marchait bien MAIS dès que j’ai essayé de faire quelque chose avec le bouton lui-même, j’ai eu un crash. Lors de la compilation, aucune erreur n’a été affichée. Solution?

Je n’ai pas réussi à associer le bouton au propriétaire du fichier. Donc, si quelqu’un ici est aussi stupide que moi, essayez ceci 🙂

Encore une autre solution / cas légèrement différente.

J’utilise Xamarin et MvvmCross et j’essayais de lier l’UIButton à un ViewModel. J’ai eu l’UIButton câblé à une sortie et un TouchUpInside.

Lorsque je lie, je n’utilise que la sortie:

 set.Bind (somethingOutlet).For ("TouchUpInside").To(vm => vm.Something); 

Tout ce que j’avais à faire était de supprimer la connexion action (TouchUpInside) dans XCode et cela l’a résolu.

PS Je suppose que c’est dans sa base tous liés aux réponses précédentes et à @Chris Kaminski en particulier, mais j’espère que cela aide quelqu’un …

À votre santé.

J’ai eu le même problème. Le problème pour moi était qu’un bouton avait deux méthodes d’action. Ce que j’ai fait a été de créer une première méthode d’action pour mon bouton, puis de la supprimer dans le contrôleur de vue, mais j’ai oublié de déconnecter la connexion dans le storyboard principal de l’inspecteur de connexion. Donc, quand j’ai ajouté une deuxième méthode d’action, il y avait maintenant deux méthodes d’action pour un bouton, ce qui provoquait l’erreur.

Pour moi, c’était une connexion restante créée dans interfacebuilder bij ctrl-drag. Le nom de la connexion rompue figurait dans le journal des erreurs

 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NameOfYourApp.NameOfYourClass nameOfCorruptConnection:]: unrecognized selector sent to instance 0x7f97a48bb000' 

J’ai eu une action liée à un bouton. En appuyant sur le bouton, l’application s’est brisée car la sortie n’existait plus dans mon code. La recherche du nom dans le journal me l’a amené dans le storyboard. Supprimé et le crash était parti!

Cela est arrivé à mon parce qu’effacer accidentellement le “@IBAction func …” dans mon code de classe UIViewcontroller, donc dans le Storyboard a été créé le sharepoint référence, mais à l’exécution il y avait une fonction pour le traiter.

La solution consistait à supprimer la référence Outlet dans l’inspecteur de propriétés, puis à la recréer en la faisant glisser avec la clé de commande vers le code de la classe.

J’espère que cela aide!

Je réponds à Leonard Challis, puisque je prenais aussi la classe C193P pour iOS de Stanford, ainsi que l’utilisateur “oli206”

“Fin de l’application en raison d’une exception non capturée ‘NSInvalidArgumentException’, raison:”

Le problème était que j’avais le bouton “Enter” sur la calculasortingce connecté deux fois, et un ami a fait remarquer que faire une inspection du bouton dans le Storyboard montrait que 2 entrées se trouvaient sur les atsortingbuts “Touch Up Inside” lorsque je cliquais sur le bouton “Entrée”. L’effacement de l’un des deux «Retranscrire» «Evénements envoyés» a résolu le problème.

Cela a montré que le problème est déclenché (pour la classe vidéo C193P dans la procédure pas à pas de la calculasortingce sur l’affectation 1) comme 2 événements envoyés, dont l’un provoquait l’exception.

Cela peut se produire lorsque vous n’affectez pas ViewController au ViewControllerScene dans InterfaceBuilder. Donc, le ViewController.m n’est connecté à aucune scène.

Y compris ma part. Je suis resté bloqué pendant un moment, jusqu’à ce que je réalise que j’ai créé un projet avec ARC (référence de comptage automatique) désactivé. Un rapide réglage sur YES sur cette option a résolu mon problème.

Une autre cause vraiment stupide est d’avoir le sélecteur défini dans l’interface (.h) mais pas dans l’implémentation (.m) (pe typo)

Une autre raison / solution à append à la liste. Celui-ci est causé par iOS6.0 (et / ou une mauvaise programmation). Dans les anciennes versions, le sélecteur correspondrait si les types de parameters correspondaient, mais dans iOS 6.0, j’ai eu des plantages dans le code précédent, où le nom du paramètre n’était pas correct.

Je faisais quelque chose comme

 [objectName methodName:@"somessortingng" lat:latValue lng:lngValue]; 

mais dans la définition (à la fois .h et .m) j’avais

 (viod) methodName:(NSSsortingng *) latitude:(double)latitude longitude:(double)longitude; 

Cela a bien fonctionné sur iOS5 mais pas sur 6, même la même version déployée sur différents appareils.

Je ne comprends pas pourquoi le compilateur ne m’a pas dit ça, de toute façon – problème résolu.

Cela peut également se produire lorsque vous souhaitez définir une propriété d’un ControllerA sur une propriété publique dans une classe ControllerB personnalisée et que vous n’avez pas encore défini la “Classe personnalisée” dans l’inspecteur d’identité des storyboards.

Une autre solution possible: Ajoutez ‘-ObjC’ à vos arguments de l’éditeur de liens.

Explication complète est ici: Catégories Objective-C dans la bibliothèque statique

Je pense que l’essentiel est le suivant: si la catégorie est définie dans une bibliothèque avec laquelle vous établissez des liens statiques, l’éditeur de liens n’est pas assez intelligent pour être associé à des méthodes de catégorie. L’indicateur ci-dessus rend le lien de l’éditeur de liens dans toutes les classes et catégories d’objectives C, et pas seulement celles qu’il estime nécessaires pour parsingr votre source. (S’il vous plaît n’hésitez pas à accorder ou corriger cette réponse. Je suis connu pour les langues liées, alors je ne fais que parronner ici).

Mon problème et ma solution étaient différents et je pensais que je devais le poster ici pour que les futurs lecteurs puissent sauver leur tête du choc au mur.

J’allouais différents xib au même UIVIewController et même après une recherche partout, je ne pouvais pas trouver comment le corriger. Ensuite, j’ai vérifié mon AppDelegate où j’appelais initWithNibName et je peux voir que lors de la copie du code, j’ai changé le nom de xib, mais j’ai oublié de changer la classe UIViewController . Donc, si aucune solution ne fonctionne pour vous, vérifiez votre méthode initWithNibName .

Je suis arrivé à cause d’arguments de contraintes contradictoires.

Basics: Invocation dynamic

L’objective C est un langage dynamic qui invoque des méthodes en examinant le runtime pour les méthodes dans les classes. Par exemple, s’il existe une classe A incluant la méthode DoSomething (arg1, arg2) . Si vous essayez d’appeler la méthode en utilisant des arguments corrects sur un object de classe A, tout fonctionnera bien. Cependant, si les arguments ne sont pas correctement transmis, par exemple, vous appelez la méthode avec un seul argument, alors que le run-time le traitera comme un appel de méthode pour une autre méthode. Finalement, l’exécution ne parviendra pas à trouver la méthode (DoSomething avec un seul argument) et à travers cette exception “sélecteur non reconnu envoyé à l’instance” .

Solution

Veuillez vérifier quelle signature pour @selector est attendue. C’est généralement le cas, comme vous l’avez décrit dans le code

 -(IBAction)numberButtonClick:(id)sender{