J'ai créé un bouton et ajouté une action pour celui-ci, mais dès qu'il s'est appelé, 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'
Voici mon code:
- (id)initWithNibName:(NSString *)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(@"---");
}
objective-c
selector
unrecognized-selector
Bonjour le monde
la source
la source
Réponses:
Il semble que la mémoire ne gère pas correctement le contrôleur de vue et qu'il est en cours de désallocation à un moment donné - ce qui entraîne l'
numberButtonClicked:
envoi de la méthode à un autre objet qui occupe maintenant la mémoire que le contrôleur de vue occupait auparavant ...Assurez-vous de conserver / libérer correctement votre contrôleur de vue.
la source
-[NSWindow end]: unrecognized selector sent to instance 0x100523e80
et bien que je réalise les similitudes avec l'OP, et même peut-être la cause du problème de votre réponse, la mise en œuvre d'un correctif n'est pas immédiatement évidentePour ceux qui arrivent ici via Google comme je l'ai fait, ce qui concerne probablement plus Xcode 4.2 + / iOS 5+ plus, qu'avec ARC. J'ai eu la même erreur " Sélecteur non reconnu envoyé à l'instance ". Dans mon cas, une action cible d'UIButton avait été configurée pour se passer comme paramètre d'expéditeur, mais j'ai réalisé plus tard que je n'en avais pas besoin et je l'ai supprimée dans le code. Donc, quelque chose comme:
A été changé en:
Un clic droit sur l'UIButton en question a montré que l'événement Retouche à l'intérieur était associé à la méthode ButtonPressed: des contrôleurs de vue. Le supprimer et le réaffecter à la méthode modifiée a fonctionné un régal.
la source
C'était la meilleure réponse de Google à ce problème, mais j'avais une cause / un résultat différent - je pensais ajouter mes deux cents au cas où d'autres tomberaient sur 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 d'interface utilisateur qui vous pose le problème, vous pouvez voir quelles connexions ont été créées. Dans mon cas, j'avais un bouton câblé jusqu'à deux actions. J'ai supprimé les actions du menu contextuel et les ai reconnectées et mon problème a été résolu.
Assurez-vous donc que vos actions sont correctement câblées.
la source
OK, je dois participer ici. L'OP a créé le bouton de manière dynamique . J'ai eu un problème similaire et la réponse (après des heures de chasse) est si simple qu'elle m'a rendu malade.
Lors de l'utilisation:
Si vous placez un signe 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 récepteur recevra une erreur s'il en attend une. Il est facile de rater les deux points si vous créez dynamiquement le nom de l'événement.
Les options de code du récepteur ressemblent à ceci:
Comme d'habitude, c'est toujours la réponse évidente qui est manquée.
la source
Dans mon cas, la fonction n'attendait pas d'argument mais le bouton a été 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:
Notez qu'il ne contient aucun argument.
Voici une image de la configuration de mon bouton (clic droit sur le bouton pour l'afficher):
Notez qu'il existe 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 à lui-même à 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.
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 ne me permet d'insérer des actions (c'est-à-dire créer une nouvelle action) qu'au-dessus ou en dessous de la fonction.
Vous devriez maintenant avoir un seul gestionnaire d'événements câblé à l'événement de bouton qui ne transmet aucun argument:
Cette réponse complète la réponse de @Leonard Challis que vous devriez également lire.
la source
Cela peut également se produire si vous ne définissez pas la "Classe" de la vue dans le générateur d'interface.
la source
Dans mon cas, j'utilisais NSNotificationCenter et j'essayais d'utiliser un sélecteur qui ne prenait aucun argument, mais ajoutait un deux-points. La suppression des deux points a résolu le problème.
Lorsque vous utilisez un nom de sélecteur, n'utilisez pas de deux-points de fin s'il n'y a pas d'arguments. S'il y a un argument, utilisez un deux-points à la fin. S'il y a plus d'un argument, vous devez les nommer avec un deux-points pour chaque argument.
Voir la réponse d'Adam Rosenfield ici: Sélecteurs en Objective-C?
la source
J'ai eu ce problème avec un projet Swift où je crée les boutons de manière dynamique. Code du problème:
La solution était d'ajouter un deux-points ':' après l'action: par exemple
Exemple complet ici: https://developer.apple.com/library/content/samplecode/UICatalog/Listings/Swift_UIKitCatalog_DefaultToolbarViewController_swift.html
la source
La cause la plus évidente de ceci (incluse par souci d'exhaustivité) est la conversion incorrecte d'un pointeur et l'appel d'une méthode de la mauvaise classe.
la source
J'ai également eu le même problème.
J'ai supprimé mon uibutton dans mon storyboard et l'ai recréé .. maintenant tout fonctionne bien.
la source
J'avais 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 fonctionnalités de redimensionnement - voir ce guide au cas où vous seriez intéressé) et j'ai oublié d'ajouter le fichier * .m à la cible de construction. Erreur stupide, mais pas toujours évidente quand il se passe où chercher. J'ai pensé que ça valait le coup d'être partagé ...
la source
Cela m'est arrivé parce que j'ai accidentellement effacé le "@IBAction func ..." à l'intérieur de mon code de classe UIViewcontroller, donc dans le Storyboard a été créé la sortie de référence, mais au moment de 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 touche de commande vers le code de la classe.
J'espère que ça aide!
la source
Je pense que vous devriez utiliser le void, au lieu de l'IBAction en type de retour. car vous avez défini un bouton par programmation.
la source
Une autre solution possible: ajoutez '-ObjC' à vos arguments de l'éditeur de liens.
L'explication complète est ici: Catégories Objective-C dans la bibliothèque statique
Je pense que l'essentiel est: si la catégorie est définie dans une bibliothèque avec laquelle vous créez un lien statique, l'éditeur de liens n'est pas assez intelligent pour créer des liens dans les méthodes de catégorie. L'indicateur ci-dessus crée le lien de l'éditeur de liens dans toutes les classes et catégories objectives C, pas seulement celles dont il pense avoir besoin en fonction de l'analyse de votre source. (S'il vous plaît n'hésitez pas à régler ou corriger cette réponse. Je connais les langues liées, donc je ne fais que perroquet ici).
la source
J'ai eu la même erreur et j'ai découvert ce qui suit:
Lorsque vous utilisez le code
Vous pensez peut-être qu'il cherche le sélecteur:
Mais c'est en fait à la recherche du sélecteur:
Ce sélecteur n'existe pas, donc vous obtenez le crash.
Vous pouvez changer 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 d'actualisation sans fournir d'expéditeur? Vous avez besoin d'une fonction qui fonctionne pour les deux. La solution simple consiste à ajouter une autre fonction:
Et puis modifiez le code déroulant d'actualisation pour appeler ce sélecteur à la place:
Je suis également en train de suivre le cours Stanford iOS sur un ancien Mac qui ne peut pas être mis à niveau vers la dernière version de Mac OSX. Je suis donc toujours en train de construire pour iOS 6.1, et cela a résolu le problème pour moi.
la source
Sur mon cas, j'ai résolu le problème après 2 heures:
L'expéditeur (un élément tabBar) n'avait pas de sortie de référencement . Donc ça ne pointait nulle part.
Créez simplement une prise de référencement correspondant à votre fonction.
J'espère que cela pourrait vous aider.
la source
IBAction
vers Swift. Donc, il se plaignait de vouloir appeler cette fonction, mais il n'a pas pu être trouvé.J'apprends actuellement le développement iOS et je suis en train de parcourir le livre "Beginning iOS6 Development" par aPress. J'obtenais la même erreur dans le chapitre 10: Storyboards.
Il m'a fallu deux jours pour le comprendre, mais j'ai découvert que j'avais accidentellement défini la balise de la cellule TableView sur 1 alors que je n'aurais pas dû. Pour tous ceux qui font ce livre et reçoivent une erreur similaire, j'espère que cela aide.
J'espère vraiment que les futures erreurs dans mon code seront plus faciles à trouver! hahaha. L'erreur de débogage n'a rien fait pour me pousser dans la bonne direction pour le comprendre (ou du moins je suis trop nouveau pour comprendre le débogueur, lol).
la source
Dans mon cas, j'utilisais un UIWebView et j'ai passé un NSString dans le deuxième paramètre au lieu d'un NSURL. Je soupçonne donc que de mauvais types de classe passés à une fonction peuvent provoquer cette erreur.
la source
.. et maintenant le mien
J'avais le bouton lié à une méthode qui accédait au paramètre d'un autre bouton et qui fonctionnait très 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 à lier le bouton au propriétaire du fichier. Donc, si quelqu'un ici est aussi stupide que moi, essayez ceci :)
la source
Encore une autre solution / cas légèrement différent.
J'utilise Xamarin et MvvmCross et j'essayais de lier l'UIButton à un ViewModel. J'ai eu l'UIButton câblé à un Outlet et un TouchUpInside.
Lors de la liaison, j'utilise uniquement la prise:
Tout ce que j'avais à faire était de supprimer la connexion d'action (TouchUpInside) dans XCode et cela l'a résolu.
PS Je suppose que c'est dans sa base que tout est lié aux réponses précédentes et à @Chris Kaminski en particulier, mais j'espère que cela aide quelqu'un ...
À votre santé.
la source
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 dans l'inspecteur de connexion. Ainsi, lorsque j'ai ajouté une deuxième méthode d'action, il y avait maintenant deux méthodes d'action pour un bouton, ce qui a causé l'erreur.
la source
Pour moi, c'était une connexion restante créée dans interfacebuilder par ctrl-dragging. Le nom de la connexion interrompue était dans le journal des erreurs
J'ai eu une action liée à un bouton. En appuyant sur le bouton, l'application a planté car la prise n'existait plus dans mon code. La recherche du nom dans le journal m'a conduit à celui-ci dans le storyboard. Supprimé, et le crash a disparu!
la source
Je réponds à Leonard Challis, puisque je prenais également la classe C193P de Stanford iOS, tout comme l'utilisateur "oli206"
"Arrêt de l'application en raison d'une exception non interceptée 'NSInvalidArgumentException', raison:"
Le problème était que j'avais le bouton "Entrer" sur la calculatrice connecté deux fois, et un ami a souligné que faire une inspection du bouton dans le Storyboard a montré que 2 entrées étaient sur les attributs "Retouche à l'intérieur" lorsque j'ai cliqué avec le bouton droit sur le bouton "Entrée". L'effacement de l'un des deux événements envoyés "Retouche à l'intérieur" a résolu le problème.
Cela a montré que le problème est déclenché (pour la classe vidéo C193P sur la procédure pas à pas de la calculatrice lors de l'affectation 1) en tant que 2 événements envoyés, dont l'un provoquait l'exception.
la source
Cela peut se produire lorsque vous n'affectez pas le ViewController à ViewControllerScene dans InterfaceBuilder. Ainsi, le ViewController.m n'est connecté à aucune scène.
la source
Y compris ma part. Je suis resté coincé là-dessus pendant un moment, jusqu'à ce que je réalise que j'ai créé un projet avec ARC (Automatic counting reference) désactivé. Un réglage rapide sur OUI sur cette option a résolu mon problème.
la source
Une autre cause vraiment idiote de ceci est d'avoir le sélecteur défini dans l'interface (.h) mais pas dans l'implémentation (.m) (faute de frappe)
la source
Une autre raison / solution à ajouter à 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 paramètres correspondaient, mais dans iOS 6.0, j'ai eu des plantages dans un code précédemment fonctionnel où le nom du paramètre n'était pas correct.
Je faisais quelque chose comme
mais dans la définition (à la fois .h et .m) j'avais
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 me l'a pas dit, de toute façon - problème résolu.
la source
Cela peut également se produire lorsque vous souhaitez définir une propriété d'un ControllerA vers 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é dans les storyboards.
la source
Mon problème et ma solution étaient différents et j'ai pensé que je devrais le poster ici pour que les futurs lecteurs puissent éviter de se cogner la tête contre le mur.
J'allouais différents xib au même UIVIewController et même après avoir cherché partout, je ne pouvais pas trouver comment le corriger. Ensuite, j'ai vérifié mon AppDelegate où j'appelais et je
initWithNibName
peux voir qu'en copiant le code, j'ai changé le nom xib, mais j'ai oublié de changer deUIViewController
classe. Donc, si aucune solution ne fonctionne pour vous, vérifiez votreinitWithNibName
méthode.la source
Cela m'est arrivé à cause d'arguments de contrainte contradictoires.
la source