60 votes

Impossible de trouver la déclaration de protocole

Donc, j'ai été en regardant autour pour le dernier couple d'heures, mais n'ont pas été en mesure de trouver une solution à ce - je serais très reconnaissant de toute aide.

J'ai deux contrôleurs de A et B, et ils ont tous deux les uns les autres comme leur délégué.

Quand je n'ai rien, à l'exception de définir les protocoles au début de l'en-tête des fichiers et #import de 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 #include au lieu de cela, ou @déclaration de classe comme - @catégorie A

au lieu de HACHAGE importer"A. h"

à l'intérieur de "B. h".

J'ai essayé presque toutes les combinaisons de ces importations, et @classes, et le comprend, mais ne peut toujours pas se débarrasser des mises en garde. Aussi, les solutions en ligne recommandé de déplacer le #importations .m les 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.

Avez-vous les gars avez des suggestions à propos de ce qui peut être fait pour résoudre ce problème?

Merci beaucoup!


Voici quelques stripped-down code après que quelqu'un m'a demandé de poster -

-- BigViewController.h --

//HASH import "BaseViewController.h"
//HASH 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 --
HASH import <UIKit/UIKit.h>

//HASH import "BigViewController.h"
//HASH include "BigViewController.h"

@class BigViewController;

@protocol BaseViewControllerDelegate
- (void) setParametersWithItemChosen:(Item *) item;
@end

@interface BaseViewController : UIViewController <...BigViewControllerDelegate...>
{

   ivars...

   //delegate
    id <BaseViewControllerDelegate> delegate;
}

@properties...
@end

--------------------------------------------------

102voto

Anomie Points 43759

Permettez-moi de réduire l'échantillon encore plus loin, et étiqueter les lignes:

VC1.h

#import "VC2.h"  // A

@class VC1;

@protocol VC1Delegate // B
@end

@interface VC1 : UIViewController <VC2Delegate> // C
@end

VC2.h

#import "VC1.h"  // D

@class VC2;

@protocol VC2Delegate // E
@end

@interface VC2 : UIViewController <VC1Delegate> // F
@end

Examinons 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

@class VC1;

@protocol VC1Delegate // B
@end

VC1.h

#import "VC1Delegate.h"
#import "VC2Delegate.h"

@interface VC1 : UIViewController <VC2Delegate> // C
@end

VC2Delegate.h

@class VC2;

@protocol VC2Delegate // E
@end

VC2.h

#import "VC1Delegate.h"
#import "VC2Delegate.h"

@interface VC2 : UIViewController <VC1Delegate> // F
@end

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.

101voto

Vinner Points 480

Écrivez le code de déclaration de protocole au-dessus des lignes #import, par exemple

@protocol -----

@fin

importer ----

@interface classname ---

37voto

litov Points 390

J'avais presque le même problème et je l'ai résolu grâce à la réponse ci-dessus, mais d'une manière légèrement différente.

tout ce que j'ai fait a été de mettre la ligne #import après la déclaration de protocole dans le fichier d'en-tête. J'espère que je peux aider. et si quelqu'un sait qu'il s'agit d'une mauvaise programmation pour une raison quelconque, merci de me le faire savoir

3voto

dawid Points 64

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 été 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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X