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?
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
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
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.