web-dev-qa-db-fra.com

Impossible de trouver la déclaration de protocole pour

J'ai deux objets, qui sont tous deux des contrôleurs de vue. Le premier (je l'appellerai viewController1) déclare un protocole. Le second (que je nommerai sans surprise viewController2) est conforme à ce protocole.

XCode me donne une erreur de construction de: 'Impossible de trouver la déclaration de protocole pour viewController1'

J'ai vu diverses questions à ce sujet et je suis certain que cela a à voir avec une erreur de boucle, mais je ne le vois tout simplement pas dans mon cas ...

Code ci-dessous ..

viewController1.h

@protocol viewController1Delegate;

#import "viewController2.h"

@interface viewController1 {

}

@end

@protocol viewController1Delegate <NSObject>

// Some methods

@end

viewController2.h

#import "viewController1.h"

@interface viewController2 <viewController1Delegate> {

}

@end

Au départ, j'avais la ligne d'importation dans viewController1 au-dessus de celle de la déclaration de protocole. Cela empêchait le projet de se construire du tout. Après avoir recherché SO, j'ai réalisé le problème et inversé les deux lignes. Je reçois maintenant un avertissement (par opposition à une erreur). Le projet se déroule bien et fonctionne parfaitement. Mais je pense toujours qu'il doit y avoir quelque chose de mal pour recevoir un avertissement.

Maintenant, pour autant que je puisse voir, lorsque le compilateur arrive à viewController1.h, la première chose qu'il voit est la déclaration du protocole. Il importe ensuite le fichier viewController.h et voit que cela implémente ce protocole.

S'il les compilait dans l'autre sens, il regarderait d'abord viewController2.h, et la première chose qu'il ferait serait d'importer viewController1.h dont la première ligne est la déclaration de protocole.

Suis-je en train de manquer quelque chose?

26
Ben Thompson

Supprimez cette ligne de viewController1.h:

#import "viewController2.h"

Le problème est que l'interface de viewController2 Est prétraitée avant la déclaration de protocole.

La structure générale du fichier doit être la suivante:

@protocol viewController1Delegate;
@class viewController2;

@interface viewController1
@end

@protocol viewController1Delegate <NSObject>
@end
68
Costique
    A.h:
    #import "B.h"  // A

    @class A;

    @protocol Delegate_A 
       (method....)
    @end

    @interface ViewController : A
    @property(nonatomic,strong)id<ViewControllerDelegate> preViewController_B;(protocol A)
    @end


    B.h:
    #import "A.h"  // A

    @class B;

    @protocol Delegate_B 
       (method....)
    @end

    @interface ViewController : B
    @property(nonatomic,strong)id<ViewControllerDelegate> preViewController_A;(protocol B)
    @end

    A.m:
    @interface A ()<preViewController_B>
    @end

    @implementation A
    (implement protocol....)
    end


    B.m:
    @interface B ()<preViewController_A>
    @end

    @implementation B
    (implement protocol....)
   @end
1
xixiaoer007

Pour ceux qui pourraient en avoir besoin:

Il est également possible de résoudre ce problème en déplaçant l'importation de ViewController1.h dans ViewController2 le fichier d'implémentation (.m) au lieu du fichier d'en-tête (.h).

Ainsi:

ViewController1.h

#import ViewController2.h

@interface ViewController1 : UIViewController <ViewController2Delegate>
@end

ViewController2.h

@protocol ViewController2Delegate;

@interface ViewController2
@end

ViewController2.m

#import ViewController2.h
#import ViewController1.h

@implementation ViewController2
@end

Cela corrigera le cas où l'erreur se produit car ViewController1.h est importé dans ViewController2.h avant la déclaration de protocole.

1
Julius