プロトコル宣言の警告

MPPopoverControllerDelegate.hファイル

#import 
@class MPPopoverController;

@protocol MPPopoverControllerDelegate     
@optional
- (void)popoverControllerDidDismissPopover:(MPPopoverController *)popoverController;
@end

MPPopoverController.hファイル

#import 

@protocol MPPopoverControllerDelegate;

@interface MPPopoverController : UIViewController 

@property (nonatomic, assign) id delegate;

@end

MPPopoverController.mファイル

#import "MPPopoverController.h"
#import "MPPopoverControllerDelegate.h"

@implementation MPPopoverController
@end

@property (nonatomic, assign) id delegate; : this line has warning

'MPPopoverControllerDelegate'のプロトコル定義が見つかりません

What is wrong? And how to fix this warning? if replace '@protocol MPPopoverControllerDelegate'; with '#import "MPPopoverControllerDelegate.h', everything will be ok.
But link - in Referring to Other Protocols you can see that apple says to use @protocol

1
@Vinceは、彼が前方宣言を使用しようとしているように見えます。 .mファイルにファイルが含まれている限り、彼はうまくいくはずです。
追加された 著者 Simon Germain,
クラスやプロトコルには前方宣言を使用し、.mファイルにファイルをインポートする方が良いでしょう。循環インクルードを回避します。
追加された 著者 Simon Germain,
どこにあなたの.hを含めていますか?
追加された 著者 Simon Germain,
'@protocol MPPopoverControllerDelegate'を置き換えた場合。 '#import "MPPopoverControllerDelegate.h"を使用すると、すべてが正常になります。
しかし、リンク - 他のプロトコルを参照すると、Appleが@protocolを使用するようになっていることがわかります
追加された 著者 rowwingman,
あなたはそれをしましたか ?
追加された 著者 user971401,
#import "MPPopoverControllerDelegate.h" が欠落していますか?
追加された 著者 user971401,

4 答え

コンパイラは.mファイルを読み込み、必要に応じて.hファイルを読み込みます。したがって、最初に MPPopoverController.h をロードし、それを読み込むとデリゲートプロトコルはまだ宣言されていません。インクルード行を交換するだけでこの警告を簡単に修正できます。コンパイラにデリゲートの.hファイルを先に読み込ませる。

#import "MPPopoverControllerDelegate.h"
#import "MPPopoverController.h"

@implementation MPPopoverController
@end
2
追加された
デリゲートの.hファイルに#import "MPPopoverController.h"という行が含まれています。あなたの質問からのコードではそうではありません。
追加された 著者 Evgen Bodunov,
私は行を変更しましたが、まだ警告が表示されます。
追加された 著者 rowwingman,

あなたのプロトコル宣言が別のヘッダファイルにあることは絶対に必要ですか?それがかなり大きなプロトコル定義(あなたのものではない)でない限り、私はあなたのインタフェース宣言の下にそれを宣言することを提案します。

MPPopoverController.h

#import 

@protocol MPPopoverControllerDelegate;

@interface MPPopoverController : UIViewController

@property (nonatomic, assign) id delegate;

@end


@protocol MPPopoverControllerDelegate     
@optional
- (void)popoverControllerDidDismissPopover:(MPPopoverController *)popoverController;
@end
2
追加された
私も同じ問題があります。 stackoverflow.com/questions/12892463/… 私はまったく同じでしたが、依然として警告メッセージが表示されます。私のプロトコルを実装してはいけないのはなぜですか?プロトコルに準拠していることを確認するにはどうすればよいですか?私は何か不足していますか?お願いします。
追加された 著者 applefreak,
@EllNeal、 "あなたの UIViewController サブクラスがプロトコルを実装するのはなぜですか?"これは代表者の仕事の仕方ではありませんか?
追加された 著者 Iulian Onofrei,
私もそうではありませんし、実際にはそうすべきではありませんが、この解決法はあなたのビルド警告を修正し、住む価値があるべきではないはずです。
追加された 著者 Ell Neal,
UIViewController サブクラスがプロトコルを実装するのはなぜですか?私は、私のポストに役立つ変更を加えました。
追加された 著者 Ell Neal,
@AppleDeveloperあなたの質問への回答を投稿しました
追加された 著者 Ell Neal,
はい、できます。しかし、なぜ外部プロトコル宣言が警告を発するのか分かりません。
追加された 著者 rowwingman,
「@interface MPPopoverController:NSObject 」という警告が表示されます。あなたの解決策は役に立たない。
追加された 著者 rowwingman,
ありがとう、私はそれを見たことがなかった。助けてくれてありがとう。
追加された 著者 rowwingman,

MPPopoverController.hとMPPopoverController.hのMPPopoverControllerDelegate.hを次のようにインポートします。

質問から貼り付けられ編集されたコードのコピーが削除されました。次のコードは、xcodeから貼り付けられたコピーです。

MPPopoverControllerDelegate.h:

@class MPPopoverController;

@protocol MPPopoverControllerDelegate     

@optional

- (void)popoverControllerDidDismissPopover:(MPPopoverController *)popoverController;

@end

MPPopoverController.h

@protocol MPPopoverControllerDelegate;


@interface MPPopoverController : UIViewController{

    id delegate;
}

@property (nonatomic, assign) id delegate;


@end

MPPopoverController.m

@implementation MPPopoverController

@synthesize delegate;
//rest of view controller class.

The problem is that in your MPPopoverController interface you specify . This means that the class implements this protocol! Is wrong because the class is the owner of the protocol. So your logic is wrong in some point.

1
追加された

MPPopoverControllerDelegate.hをどこかに追加してもよろしいですか?

1
追加された
問題は解決しました!
追加された 著者 Alex Terente,
誰が私に投票したかを推測させてください。
追加された 著者 Alex Terente,
@テレンテえ?私はあなたのコードに誤りがあると指摘しました。それはかなりです。ところで、あなたのコードはまだ動作しません。多分私はそれをあまりにも投票する必要がありますか?
追加された 著者 Simon Germain,
MPPopoverController.mファイルに追加します
追加された 著者 rowwingman,
NO。私の質問を投稿する前に、MPPopoverControllerDelegate.hファイルがMPPopoverController.mファイルで減速されました。
追加された 著者 rowwingman,
@TerenteIonutAlexandru - ここでのポイントは、誰があなたを落胆させたのかを知るのではなく、むしろOPの問題を解決する方法です。また、間違ったことを推測しないでください。
追加された 著者 user971401,