2つのオブジェクトがありますが、どちらもView Controllerです。最初の(これをviewController1と呼びます)はプロトコルを宣言します。 2番目(当然ですが、viewController2と名付けます)はこのプロトコルに準拠しています。
XCodeから「viewController1のプロトコル宣言が見つかりません」というビルドエラーが表示されます。
私はこのテーマに関するさまざまな質問を見てきましたが、ループエラーに関係していると確信していますが、私の場合はそれを見ることができません...
以下のコード。
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
最初は、viewController1にプロトコル宣言のインポート行より上のインポート行がありました。これは、プロジェクトの構築をまったく妨げていました。 SOで検索した後、私は問題を認識し、2行を切り替えました。現在、エラーではなく警告が表示されています。プロジェクトは正常にビルドされ、実際に完全に実行されます。しかし、私はまだ警告を与えるには何か間違っているに違いないと感じています。
さて、私が見る限り、コンパイラがviewController1.hに到達すると、最初に目にするのはプロトコルの宣言です。次に、viewController.hファイルをインポートし、これがこのプロトコルを実装していることを確認します。
逆にコンパイルする場合は、最初にviewController2.hを調べ、最初に行うのはviewController1.hをインポートすることです。最初の行はプロトコル宣言です。
何か不足していますか?
viewController1.h
から次の行を削除します。
#import "viewController2.h"
問題は、viewController2
のインターフェースがプロトコル宣言の前に前処理されることです。
ファイルの一般的な構造は次のようになります。
@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
それを必要とするかもしれない人のために:
ヘッダーファイル(.h)ではなくViewController2の実装ファイル(.m)でViewController1.hのインポートを移動することで、これを修正することもできます。
そのようです:
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
これにより、プロトコル宣言の前にViewController1.hがViewController2.hにインポートされるため、エラーが発生するケースが修正されます。