Erreur Xcode: aucune méthode d'instance connue pour le sélecteur
J'ai besoin d'aide au débogage de ma classe. J'obtiens une erreur tellement bizarre que je ne pouvais pas trouver quelque chose de similaire, donc je vais mettre la plupart de mon code.
//Tab.h
#import <UIKit/UIKit.h>
@class Tab;
@protocol TabDelegateDataSource <NSObject>
@required
-(void)removeTab:(Tab *)tab;
@end
@interface Tab : UIView
{
id <TabDelegateDataSource> __strong _delegate;
}
@property(strong) id <TabDelegateDataSource> delegate;
-(void)removeTab;
@end
// Tab.m
#import "Tab.h"
@implementation Tab
@synthesize delegate = _delegate;
-(void)removeTab
{
[self.delegate removeTab:self];//Error here saying: No known instance method for selector 'removeTab:'
}
@end
source d'informationauteur Jordan Medlock
Vous devez vous connecter pour publier un commentaire.
Je peux maintenant recréer et de corriger cette erreur.
Assurez-vous que l' .h-tête où il est défini ...
... est inclus où que vous prévoyez d'utiliser le délégué, par exemple, quelque part au sommet de l' .m source qui comprend ceci:
Si le compilateur a seulement vu un avant de définition de TabDelegateDataSource comme ceci:
Vous obtiendrez le message d'erreur:
et pas le plus attendu de l'avant de la définition d'erreur lié à
Je pense que c'était un bête problème avec Xcode j'ai redémarré l'application d'un couple de fois et il a fini par travailler sur.
Vous devriez toujours vérifier votre délégué de cette façon, avant l'appel d'une méthode, même avec le protocole requis méthodes:
De le faire, même pour les méthodes requises ajoute à la sécurité, que ce contrôle est effectué au moment de l'exécution.
Quelqu'un peut ignorer ou de désactiver les avertissements du compilateur, ou de tromper le compilateur type de moulages.
Par exemple:
Aussi, vous souhaitez peut-être utiliser
performSelector
pour l'appel de méthode:Assurez-vous que vous n'avez pas a incorrectement déclaré le délégué de la propriété dans l'interface (probablement par des copier-coller à partir d'un autre fichier). Par exemple:
La ligne ci-dessus sera la cause de la "Non connu de la méthode d'instance pour le sélecteur" pour cause d'incompatibilité avec les indtended protocole , probablement un copier-coller de l'erreur. En outre, il est probable remplaçant la référence correcte à partir d'une autre classe où il appartient en réalité, loin de cette ligne de code, ce qui rend difficile à repérer.
Correcte au-dessus de la déclaration de vos biens avec le protocole prévu:
Essayez de renommer le
delegate
à d'autres commedelegateForTab
.Votre classe
Tab
est sous-classementUIView
doncself.delegate
'sself
classe est aussi une sous-classe de laUIView
.UIView
peut a son propre délégué(il hérite de UIResponder, et profonde de NSObject), et il n'a pas le-(void)removeTab
méthode. Juste mon estimation personnelle.Ma solution est de renommer (pas de trouver la réponse si elle peut être sous-classé pas encore).
Suggestion pour l'utilisation de délégué: Vous devez mettre en œuvre la
protocol
et l'utilisation de ladelegate
dans d'autres contrôleurs de vue, pas dans la même classe que vous déclarez. 🙂Mon problème est que j'ai manqué de déclarer
<NSObject>
dans le Protocole.Cette erreur n'est pas une erreur de compilation, n'est-ce pas? Parce que je n'ai pas d'erreurs de compilation avec votre code ici.
Donc si c'est une erreur d'exécution, avez-vous déclaré
<TabDelegateDataSource>
dans votre délégué des classes comme ceci:@interface SomeClass : UIView <TabDelegateDataSource>
Si vous l'avez fait, le compilateur doit être pour vous avertir si votre méthode d'instance ne peut pas être trouvé.
Ou peut-être vous devriez aussi poster le code de votre délégué de classe pour plus d'informations.
P. S. Le délégué ne doit pas être
__strong
. Vous feriez mieux d'utiliser__unsafe_unretained
à la place.- Je importer mes appdelegate.h et erreur résolu...
Quelqu'un pourrait nécessaire,
Remarque: Ne pas oublier que c',
#import <objc/message.h>