Question

J'ai créé un bouton et ajouté une action, mais dès qu'il a invoqué, je suis arrivé 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:(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(@"---");
}
Était-ce utile?

La solution

On dirait que vous n'êtes pas la mémoire de gestion du contrôleur de vue correctement et il est désallouée à un moment donné - ce qui provoque la méthode numberButtonClicked: à envoyer à un autre objet qui occupe maintenant la mémoire que le contrôleur de vue occupait précédemment. ..

Assurez-vous de bien retenir / libérer votre contrôleur de vue.

Autres conseils

Pour ceux d'arriver ici via Google comme je l'ai fait, ce qui se rapporte probablement plus à Xcode 4.2 + / iOS 5+ plus, ce avec l'ARC. J'ai eu la même erreur « sélecteur non reconnu envoyé à l'instance ». Dans mon cas, j'ai eu une action cible de UIButton mis en place pour se faire passer comme paramètre de l'expéditeur, mais réalisé plus tard, je ne l'ai pas besoin et enlevé que dans le code. Donc, quelque chose comme:

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

a été changé à:

- (IBAction)buttonPressed {

clic droit sur le UIButton en question a montré que l'événement Inside Touch Up a été associé aux contrôleurs de vue ButtonPressed: méthode. La suppression de cette réaffectant et la méthode modifiée travaillé un régal.

Ce fut la réponse Google en haut de cette question, mais j'avais une cause différente / résultat - Je pensais ajouter dans mes deux cents dans d'autres cas de tomber sur ce problème.

J'ai eu un problème similaire ce matin. J'ai trouvé que si vous cliquez droit sur l'élément de l'interface utilisateur vous donnant le problème, vous pouvez voir quels liens ont été créés. Dans mon cas, j'avais un bouton câblé à deux actions. J'ai supprimé les actions du menu contextuel et les ReWired et mon problème a été résolu.

Donc, assurez-vous des actions sont câblés droit.

OK, je dois puce ici. L'OP créé dynamiquement le bouton . J'ai eu un problème similaire et la réponse (après les heures de chasse) est si simple qu'il m'a rendu malade.

Lorsque vous utilisez:

action:@selector(xxxButtonClick:)

or (as in my case)

action:NSSelectorFromString([[NSString alloc] initWithFormat:@"%@BtnTui:", name.lowercaseString])

Si vous placez 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, il ne sera pas, et le récepteur obtiendrez une erreur si elle attend un. Il est facile de manquer le côlon si vous créez dynamiquement le nom de l'événement.

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

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

Comme d'habitude, il est toujours la réponse évidente qui obtient manqué.

Dans mon cas, la fonction ne s'y attendait un argument, mais le bouton a été configuré pour envoyer un responsable de l'erreur. Pour résoudre ce problème, je devais recâbler le gestionnaire d'événements.

Voici ma fonction:

entrer image description ici

Remarquez qu'il ne contient aucun argument.

Voici une image de ma configuration de bouton (clic droit sur le bouton pour voir):

entrer image description ici

Notez qu'il ya 3 gestionnaires d'événements.

Pour résoudre ce problème, je devais retirer chacun des éléments de l'événement puisque l'un d'entre eux envoyais une référence à lui-même à la fonction enterPressed. Pour supprimer ces articles que je clique sur la petite icône x à côté du nom de chaque élément jusqu'à ce qu'il n'y avait pas d'éléments affichés.

entrer image description ici

Ensuite je devais reconnecter le bouton à l'événement. Pour cela, maintenez la touche Ctrl enfoncée, puis faites glisser une ligne à partir du bouton à l'action. Il faut dire « Connect Action ». Note: Je devais redémarrer XCode pour que cela fonctionne pour une raison quelconque; sinon laissez-moi seulement insérer des actions (créer aka une nouvelle action) au-dessus ou au-dessous de la fonction.

entrer image description ici

Vous devriez maintenant avoir un seul gestionnaire d'événements associé à l'événement bouton qui passe sans argument:

entrer image description ici

Cette réponse compliments la réponse par @Leonard Challis que vous devriez lire ainsi.

Cela peut également se produire si vous ne réglez pas la « classe » de la vue dans le constructeur d'interface.

Dans mon cas, j'utilisais NSNotificationCenter et tentais d'utiliser un sélecteur qui a pas d'arguments, mais ajoutais deux points. Retrait du côlon résolu le problème.

Lorsque vous utilisez un nom de sélection, ne pas utiliser deux points de fuite s'il n'y a pas d'arguments. S'il y a un argument, utilisez un colon de fuite. S'il y a plus d'un argument, vous devez les nommer ainsi que deux points de fuite pour chaque argument.

Voir la réponse d'Adam Rosenfield ici: Selectors en Objective-C

J'ai eu ce problème avec un projet Swift où je crée les boutons dynamiquement. Code du 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 a été d'ajouter 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 / bibliothèque / content / SampleCode / UICatalog / Annonces / Swift_UIKitCatalog_DefaultToolbarViewController_swift.html

La cause la plus évidente de ce (inclus pour être complet) est coulée de manière incorrecte un pointeur et 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 est légèrement différente. Dans mon cas, je une catégorie d'étendre une classe existante (UIImage pour certaines capacités de redimensionnement - voir cette

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 pour le sélecteur:

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

Ce sélecteur n'existe pas, donc vous obtenez l'accident.

Vous pouvez changer le sélecteur de recevoir (id) expéditeur afin de résoudre l'erreur.

Mais si vous avez d'autres fonctions qui appellent la fonction de rafraîchissement sans fournir un expéditeur? Vous avez besoin d'une fonction qui fonctionne pour les deux. solution facile est d'ajouter une autre fonction:

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

Et puis modifiez le code de rafraîchissement pulldown appeler ce sélecteur à la place:

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

Je fais aussi le cours iOS Stanford sur un ancien Mac qui ne peuvent pas être mis à niveau vers la dernière version de Mac OSX. Donc, je suis toujours construire pour iOS 6.1, ce qui a résolu le problème pour moi.

J'ai eu le même problème.

Je supprimé mon UIButton dans mon story-board et recréée .. maintenant tout fonctionne très bien.

Ce qui est arrivé à mon car effacer accidentellement le « @IBAction fonc ... » dans mon UIViewController code de classe, donc dans le storyboard a été créé le sortie de référence, mais lors de l'exécution il y avait une fonction à traiter.

La solution était de supprimer la référence de sortie à l'intérieur de l'inspecteur de la propriété, puis le recréer en faisant glisser avec la touche de commande au code de la classe.

it helps!

Je pense que vous devriez utiliser le vide, au lieu du IBAction dans le type de retour. parce que vous avez défini un bouton programme.

Une autre solution possible: Ajouter '-ObjC' à vos arguments de l'éditeur de liens

.

Une 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 que vous liez statiquement avec l'éditeur de liens est pas assez intelligent pour créer un lien dans les méthodes de catégorie. Le drapeau fait le lien ci-dessus l'éditeur de liens dans toutes les classes objectives C et catégories, et pas seulement ceux qu'il pense il faut partir de l'analyse source. (S'il vous plaît ne hésitez pas à régler ou corriger cette réponse. Je connaissais des langues liées, donc je suis juste recopiage ici).

Je suis en train d'apprendre le développement iOS et en passant par le livre « A partir iOS6 développement » par aAppuyez. Je recevais la même erreur dans le chapitre 10. Storyboards

Il m'a fallu deux jours pour le comprendre, mais a découvert que je mis accidentellement l'étiquette de la cellule TableView à 1 quand je ne devrais pas avoir. Pour tous ceux qui font autre ce livre et recevoir une erreur semblable, j'espère que cela aide.

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

Dans mon cas, je travaillais avec un UIWebView et je suis passé un NSString dans le second paramètre au lieu d'un NSURL. Donc, je pense que mauvais types de classe passé à une fonction peut provoquer cette erreur.

.. Et maintenant, moi

J'ai eu le bouton lié à une méthode qui accède le paramètre d'un autre bouton et qui fonctionnait très bien mais dès que j'essayé de faire quelque chose avec le bouton lui-même, je suis arrivé un accident. Lors de la compilation, aucune erreur n'a été affiché .. Solution?

Je ne liant le bouton au propriétaire du fichier. Donc, si quelqu'un ici est aussi stupide que moi, essayez ceci:)

Une autre solution / cas un peu différent.

J'utilise Xamarin et MvvmCross et je tentais de lier le UIButton à un ViewModel. J'ai eu le UIButton câblé à une sortie et un TouchUpInside.

Quand je Binding utilise uniquement la sortie:

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

Tout ce que je devais faire était supprimer la connexion d'action (TouchUpInside) dans XCode et qui a résolu le problème.

P.S. Je suppose que cela est dans sa base tout en rapport avec les réponses précédentes et en particulier Kaminski @ Chris, mais j'espère que cela aide quelqu'un ...

Vive.

J'ai eu le même problème. Le problème pour moi est que un bouton avait deux méthodes d'action. Ce que je faisais était de créer une première méthode d'action pour mon bouton et puis supprimé dans le contrôleur de vue, mais il a oublié de déconnecter la connexion dans le story-board principale dans l'inspecteur de connexion. Alors, 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 a causé l'erreur.

Pour moi, ce fut une connexion restes créée en InterfaceBuilder ctrl-bij traînage. Le nom de la connexion interrompue était 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 écrasé l'application, car la sortie n'existait plus dans mon code. Recherche de nom dans le journal m'a conduit à dans le story-board. Supprimé, et l'accident a disparu!

Sur mon cas, je résolu le problème au bout de 2 heures:

L'expéditeur (un article tabBar) a ne pas avoir de référencement Outlet . Donc, il pointait nulle part.

Juste créer une prise de référence correspondant à votre fonction.

Espérons que cela pourrait vous aider les gars.

Je réponds à Leonard Challis, depuis que je prenais aussi la classe Stanford iOS C193P, tout comme l'utilisateur "oli206"

"Mettre fin à l'application du fait exception uncaught 'NSInvalidArgumentException', raison:"

Le problème était que j'avais le bouton « Enter » sur la calculatrice connecté deux fois, et un ami fait remarquer que faire une inspection du bouton dans le storyboard a montré que 2 entrées étaient sur le « Touch Up Inside » attributs quand je faites un clic droit sur le bouton « Enter ». Effacement d'un des deux « Touch Up Inside » « a des événements » a résolu le problème.

Ceci a montré que le problème est déclenché (pour la classe vidéo C193P sur la calculatrice Démonstration sur la cession 1) 2 événements envoyés, dont l'un a été à l'origine de l'exception.

Il peut se produire lorsque vous ne donnez pas le ViewController au ViewControllerScene en le InterfaceBuilder. Ainsi, le ViewController.m est relié à aucune scène.

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

Une autre est la cause de cette vraiment stupide d'avoir le sélecteur défini dans l'interface (.h), mais pas dans la mise en œuvre (.m) (P. E. faute de frappe)

Une autre raison / solution à ajouter à la liste. Celui-ci est causée par iOS6.0 (et / ou mauvaise programmation). Dans les anciennes versions du sélecteur correspondra si les types de paramètres adaptés, mais dans iOS 6.0 je suis arrivé plantages dans le code de travail précédemment où le nom du paramètre est incorrect.

Je faisais quelque chose comme

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

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

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

Cela a fonctionné très bien sur iOS5 mais pas sur 6, même la même version exacte déployé à différents périphériques.

Je ne comprends pas pourquoi le compilateur coudn't me dire cela, en tout cas - problème semelles

.

Cela peut également se produire lorsque vous souhaitez définir une propriété d'un ControllerA à une propriété publique dans une classe ControllerB personnalisée et vous avez pas encore la « classe personnalisée » à l'intérieur de l'inspecteur d'identité storyboards encore.

Mon problème et la solution était différente et je pensais que je devrais poster ici afin que les futurs lecteurs peuvent sauver leur tête de frapper au mur.

J'allouait différents à même xib UIViewController et même après avoir cherché partout où je ne pouvais pas trouver comment la corriger. Ensuite, j'ai vérifié mon AppDelegate où j'appelle initWithNibName et peut voir que tout en copiant le code, j'ai changé le nom de xib, mais il a oublié de changer de classe de UIViewController. Donc, si la solution ne fonctionne pour vous, vérifiez votre méthode initWithNibName.

il me est arrivé à cause des arguments de contraintes contradictoires.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top