2

私のクラス.hは次のようになります:

@protocol AppInfoDelegate;
@class InfoTextView;


@interface AppInfoViewController : UIViewController <AppInfoDelegate> {

}


@property (nonatomic, retain) NSArray *textObjectsArray;
@property (nonatomic, retain) InfoTextView *itView;
@property (nonatomic, retain) UIButton *pgBackButton;
@property (nonatomic, retain) UIButton *pgFwdButton;

@end

@protocol AppInfoDelegate <NSObject>
- (void)closeButtonPressed:(id)sender;

@end

AppInfoDelegateのプロトコル定義が見つからないという警告が表示されます。これを行うための適切な方法は何ですか?なぜそれが見つからないのですか?インターフェイスの前にプロトコルの完全な定義を持っている必要がありますか?ありがとう!

4

4 に答える 4

17

@protocol MyProtocol;たとえば、メソッドがid <MyProtocol>引数として受け取ることをアサートする場合などに、 usingが役立ちます。

クラスが に準拠していると主張する場合には役に立ちませ<MyProtocol>これは、クラスが実際にプロトコルに準拠していることを確認するために、コンパイラが完全なプロトコル宣言を必要とするためです。(このコンパイル時のチェックは、古い非公式プロトコルの代わりに正式プロトコルを使用する大きな理由の 1 つです。)

2 つの方法で修正できます。1つは、@skramが示唆するように、すべてを前方宣言することです。これは機能しますが、私の見解ではかなり制限されています。その場合、プロトコルを気にする必要は@interfaceありません。クラスにすべてを入れて、それで完了です。

私が好む 2 番目のアプローチは、実際にはMyProtocol.h. その後、必要に応じて、これを任意のヘッダーまたは実装ファイルに自由にインポートできます。これにより、プロトコルを簡単に再利用できます (また、時々発生する循環インポートの問題を回避できます)。

于 2012-06-18T22:17:13.310 に答える
0

これを試して:

@protocol AppInfoDelegate <NSObject>
- (void)closeButtonPressed:(id)sender;

@end   

@class InfoTextView;


@interface AppInfoViewController : UIViewController <AppInfoDelegate> {

}


@property (nonatomic, retain) NSArray *textObjectsArray;
@property (nonatomic, retain) InfoTextView *itView;
@property (nonatomic, retain) UIButton *pgBackButton;
@property (nonatomic, retain) UIButton *pgFwdButton;

@end
于 2012-06-18T22:11:22.133 に答える
0

はい、クラス定義の前に、スーパークラスと採用されたプロトコル定義を (逐語的に、または #import を使用して) 定義する必要があります。それらを前方宣言することはできません。

于 2012-06-18T22:16:01.830 に答える
-1

私は常に @interface の前にプロトコル定義全体を見てきました。別のファイルに入れることもできると思いますが

于 2012-06-18T22:09:02.360 に答える