Ne peut pas trouver le protocole de déclaration
J'ai deux view controllers A
et B
, et ils ont tous deux les uns les autres comme leurs délégués.
Quand je n'ai rien, à l'exception de définir les protocoles au début de l'en-tête des fichiers et des #import
l'autre fichier d'en-tête, j'en ai deux erreurs le long de la lignes de
ne peut pas trouver le protocole de déclaration pour "BDelegate", qui a été montrant dans
A. h (où j'ai écrit ) ne peut pas trouver le protocole de déclaration pour
"ADelegate", qui a été montrant dans B. h (où j'ai écrit )
À la recherche en ligne, les gens avait écrit plus tôt que la circulaire de l'inclusion des fichiers d'en-tête pourrait conduire à des problèmes. Ils ont recommandé, soit à l'aide de #include
au lieu de cela, ou @class
déclaration comme -
@class A
au lieu de
#import A.h
à l'intérieur de #import B.h
J'ai essayé presque toutes les combinaisons de ces importations, et @classes
, et #include
, mais ne peut toujours pas se débarrasser des mises en garde. Aussi, les solutions en ligne recommandé de déplacer le #import
à la .m
fichiers, mais cela n'a pas aidé non plus. Partie de la raison en est que les solutions en ligne sont un peu floue - si vous pouviez briser ce serait génial.
Toutes les suggestions sur ce qui peut être fait pour résoudre ce problème?
-- BigViewController.h --
#import "BaseViewController.h"
#include "BaseViewController.h"
@class BigViewController;
@protocol BigViewControllerDelegate
-(void) BigViewController:(BigViewController *) bigView;
@end
@interface BigViewController : UIViewController <BaseViewControllerDelegate>
{
//delegate
id <BigViewControllerDelegate> delegate;
ivars...
}
@properties...
@end
--------------------------------------------------
-- BaseViewController.h --
#<UIKit/UIKit.h>
#import "BigViewController.h"
#include "BigViewController.h"
@class BigViewController;
@protocol BaseViewControllerDelegate
- (void) setParametersWithItemChosen:(Item *) item;
@end
@interface BaseViewController : UIViewController <...BigViewControllerDelegate...>
{
ivars...
//delegate
id <BaseViewControllerDelegate> delegate;
}
@properties...
@end
- Vous pourriez peut-être poster une partie du code (réduit à montrer où vous êtes à la définition de ce qu').
- Je viens de poster quelques. L'indentation est très bizarre - désolé!
- Dans l'avenir, l'utilisation de la
{}
bouton en haut à envelopper le code, ou bien manuellement le format à l'aide du dos de la tique. - ok, va garder cela à l'esprit
- J'ai connu le même problème et résolu encore, à la suite de l' @TwistedUmbrella instruction.
- Vérifiez vos fichiers inclus.<br> C'est un symptôme de deux mutuellement compris les en-têtes.<br> Parfois, il l'origine de cette erreur.
- Essayez cette stackoverflow.com/questions/10160887/...
- A connu le même problème, ont juste déplacé le protocole de déclaration ci-dessous uikit d'importation.
Vous devez vous connecter pour publier un commentaire.
Permettez-moi de réduire l'échantillon encore plus loin, et étiqueter les lignes:
VC1.h
VC2.h
Considérer ce qui se passe quand quelque chose #importations VC1.h: ce qu'Il atteigne la ligne A, puis l'importation est traitée. La ligne D ne fait rien car VC1.h a déjà été importé. Ensuite, la ligne E est traitée. Ensuite, la ligne F, et nous obtenons une erreur, car nous n'avons pas obtenu à la ligne B pourtant si le protocole n'est pas déclaré!
Considérons alors ce qui se passe quand quelque chose #importations VC2.h: ce qu'Il atteigne la ligne D, puis l'importation est traitée. La ligne A ne fait rien car VC2.h a déjà été importé. Ensuite, prendre la ligne B est traitée. Ensuite, prendre la ligne C, et nous obtenons une erreur, car nous n'avons pas obtenu à la ligne E qui est pourtant si le protocole n'est pas déclaré!
La première étape consiste à reconsidérer si ces deux classes ont vraiment besoin d'être des uns et des autres délégués. Si vous pouvez rompre le cycle, ce serait probablement la voie à suivre. Si non, vous aurez besoin de restructurer votre les en-têtes. La façon la plus simple est probablement de mettre les délégués dans leurs propres en-têtes:
VC1Delegate.h
VC1.h
VC2Delegate.h
VC2.h
Si vous suivre à travers les importations de maintenant, vous allez voir que les protocoles appropriés seront désormais toujours être déclarés avant le @de l'interface des lignes d'essayer de les utiliser.
Écrire protocole de déclaration de code au-dessus de la #importation de lignes
par exemple,
@protocol -----
@fin
importation ----
@interface classname ---
J'ai eu presque le même problème, et j'ai fixé grâce à la réponse ci-dessus, mais d'une manière légèrement différente.
j'ai tout mis la ligne #import après le protocole de déclaration dans le fichier d'en-tête.
j'espère que je peux aider. et si quelqu'un sait que c'est une mauvaise programmation pour une raison quelconque, s'il vous plaît laissez-moi savoir
J'ai trouvé une autre solution à ce problème car je n'ai pas vraiment aimé l'idée d'avoir juste quelques #importations entre la classe et le protocole de déclaration.
En gros, il vous suffit de déplacer
<YourProtocolName>
de la .h fichier de la classe à la classe de l'extension dans le .m fichierDonc dans votre .m fichier que vous ajoutez
Je ne sais pas si c'est vraiment une bonne pratique, mais il ressemble à une solution plus propre à éviter l'importation des cycles.
Essayer de mettre les < BaseViewControllerDelegate > ou < BigViewControllerDelegate > dans la mise en œuvre de fichier plutôt que de l'en-tête de fichier. Il va travailler.
J'ai suivi la correction du déplacement du protocole avant l'importation et il a résolu le problème... l'importation inclus le délégué, c'était donc à l'origine du problème.
Mais ensuite j'ai pensé, pourquoi étais-je importer le délégué de toute façon? Je n'étais pas le référencement de ses propriétés et je n'ai pas d'appeler une de ses méthodes directement (c'est ce que le protocole de déclarer a été pour).
J'ai essayé de commenter l'importation du délégué et vu où l'erreur est survenue et a trouvé que j'avais l'importation de quand j'étais importer le délégué a fait une déclaration que le délégué de l'importation c'est à dire j'ai été à l'importation d'Un (aussi mon délégué), a l'importation de B, ce que j'étais en réalité à l'aide de a B. j'ai Donc quitté l'importation d'Un commentée et ajouté une importation pour B. Ensuite, j'ai pu mettre l'import-protocole de commande de retour la façon dont il était.