web-dev-qa-db-fra.com

"Aucune @ interface visible pour 'BlahDataController' déclare le sélecteur 'aMethod:'"

Un exemple simple de mon problème:

"Dans le BlahDataController.h"

@interface BlahDataController : NSObject
-(NSString *)aMethod:(NSString *)theString;
@end

"Dans le BlahDataController.m"

#import "BlahDataController.h"
@implementation BlahDataController

-(NSString *)aMethod:(NSString *)theString
{
    return @"Something";
}

@end

"Dans BobViewController.h"

@interface BobViewController : NSObject
-(void)aMethodOfSomeSort;
@end

"Dans BobViewController.m"

#import "BobViewController.h"
#import "BlahDataController.h"

@implementation BobViewController

-(void)aMethodOfSomeSort
{
    BlahDataController *blahDataController = [[BlahDataController alloc] init];
    NSLog(@"%@",[blahDataController aMethod:@"Variable"]);
}

@end

Sur la ligne "NSLog (@"% @ ", [blahDataController aMethod: @" Variable "]);" Je reçois le message d'erreur: "Pas d'interface @ visible pour 'BlahDataController' déclare le sélecteur 'aMethod:'"

Quelqu'un sait pourquoi cette erreur se produit?

- = - = - = - = - = - = - = - = - = - = - = -

Le problème est que, dans mon programme actuel, j'ai la même implémentation et que cela fonctionne bien pour des centaines de méthodes créées de cette façon. Cependant, de temps en temps, je recevrai cette erreur sur une méthode nouvellement créée. Je ne l'ai pas fait différemment. Cela ne veut tout simplement pas reconnaître sa nouvelle existence.

- = - = - = - = - = - = - = - = - = - = - = -

C’est ainsi que je suis en train de la contourner, bien que je ne sache pas pourquoi le compilateur accepte cette méthode, mais pas l’autre:

Modifier BobViewController.m:

#import "BobViewController.h"
#import "BlahDataController.h"
#import "AnotherDataController.h"

@implementation BobViewController

-(void)aMethodOfSomeSort
{
    BlahDataController *blahDataController = [[BlahDataController alloc] init];
    AnotherDataController *anotherDataController = [[AnotherDataController alloc] init];
    [anotherDataController fixedMethod:blahDataController theString:@"Variable"];
}

@end

"Dans le AnotherDataController.h"

@interface AnotherDataController : NSObject
-(void)fixedMethod:(BlahDataController *)blahDataController theString:(NSString *)theString;
@end

"Dans le AnotherDataController.m"

#import "AnotherDataController.h"
#import "BlahDataController.h"
@implementation AnotherDataController

-(void)fixedMethod:(BlahDataController *)blahDataController theString:(NSString *)theString
{
    NSLog(@"%@",[blahDataController aMethod:theString]);
}
@end

Et .... cela fonctionne très bien ... Donc, j'imagine que xcode ne reconnaît pas la méthode dans une classe, et fonctionne comme il se doit dans une autre ... Man, je ne sais pas pourquoi cette erreur se produit ... .

- = - = -

Mise à jour mineure:
Faire toute la "danse xcode" n'a pas résolu le problème
1) Construction épurée
2) Supprimer les données dérivées
3) Fermer complètement XCode et rouvrir 

29
Highrule

tl; dr - Il y a un fichier en double quelque part dans le projet! Allez le chasser et le détruire sans merci!

Ok, pour tous ceux à l'avenir avec ce numéro; c'est ce que le problème était.

J'ai créé BlahDataController il y a des mois. Il y a environ une semaine, j'ai restructuré les dossiers du projet et déplacé BlahDataController d'un dossier appelé "Blah" vers un autre dossier appelé "Data".

Lorsque j'ai changé le code de BlahDataController dans le dossier "Data", une de mes classes pouvait voir le code modifié, mais pas une autre classe.

Ce qui a fini par être le problème, c'est que lorsque j'ai déplacé BlahDataController, il en a créé une copie. J'ai donc eu un BlahDataController dans le dossier "Data" et un ancien BlahDataController dans le dossier "Blah". Même si l'ancien BlahDataController n'était plus attaché au projet dans le gestionnaire de projet (côté gauche de xcode), le problème, c'est que le fichier physique existait toujours.

Après avoir supprimé l'ancienne copie dupliquée de BlahDataController, le problème a été résolu.

55
Highrule

Si quelqu'un tombe sur un problème similaire, dans mon cas, j'ai procédé à une refactorisation à l'aide de la fonctionnalité "Rechercher et remplacer" (cas ignoré) et j'ai obtenu quelque chose comme ceci:

SomeClass* SomeClass = [[SomeClass alloc] init];
[SomeClass instanceMethod];

et il disait: "Pas d'interface @ visible pour 'SomeClass' déclare la méthode 'alloc'. Donc, dans mon cas, le problème était que j'ai renommé la variable d'instance en majuscule. La solution était:

SomeClass* someClass = [[SomeClass alloc] init];
[someClass instanceMethod];

PS: je recommande d’utiliser la fonctionnalité "Refactor" dans Xcode au lieu de "Rechercher & Remplacer" si possible. 

4
Maxim Chetrusca

Remarque: pas la réponse à cette question exacte, mais je suis arrivé ici à la recherche de la même erreur de compilation.

Assurez-vous de savoir si vous appelez la méthode d'instance ou la méthode statique:

@interface SomeClass

+(void) SomeMethod;

vs.

-(void) SomeMethod;

Ce sont différents.

[SomeClass SomeMethod];

vs.

[[[SomeClass alloc] init] SomeMethod];
4
Nick

Notez également que cela peut arriver (par exemple avec le modèle de projet maître/détail) si le 

"Other Linker Flags"

la valeur est définie sur 

-ObjC

comme requis par certains cadres, par exemple RestKit (problème sur la page github des RestKits: https://github.com/RestKit/RestKit/issues/1153 )

2
Lennert

Oui j'ai eu le même problème. J'ai eu ce travail parfait dans ma cible payée bien que quand j'ai changé pour ma cible libre j'ai eu cette erreur. 

Aucun @interface visible pour 'GameOverScene' déclare le sélecteur mesageToDisplayOnLabel:

  • pour résoudre ce problème, l'orthographe de mon appel de méthode était différente de celle que j'appelais. 

    - (void) messageToDisplayOnLabel // le s manque dans le "message" de mon appel de méthode Doh!
    {
    // code de méthode
    }

  • vérifiez l'orthographe de la méthode que vous appelez pourrait aider.

0
uplearnedu.com