协议声明警告

时间:2012-02-06 10:45:03

标签: iphone ios ipad delegates protocols

MPPopoverControllerDelegate.h文件

#import <Foundation/Foundation.h>
@class MPPopoverController;

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

MPPopoverController.h文件

#import <UIKit/UIKit.h>

@protocol MPPopoverControllerDelegate;

@interface MPPopoverController : UIViewController <MPPopoverControllerDelegate>

@property (nonatomic, assign) id<MPPopoverControllerDelegate> delegate;

@end

MPPopoverController.m文件

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

@implementation MPPopoverController
@end

@property (nonatomic, assign) id<MPPopoverControllerDelegate> delegate;:此行有警告

  

找不到'MPPopoverControllerDelegate'

的协议定义

有什么问题?以及如何修复此警告? 如果替换'@protocol MPPopoverControllerDelegate';使用'#import“MPPopoverControllerDelegate.h',一切都会好的。
但是link - 在参考其他协议中你可以看到苹果说要使用@protocol

4 个答案:

答案 0 :(得分:2)

是否绝对需要将协议声明放在不同的头文件中?除非它是一个非常大的协议定义(你的不是你的),我建议在你的接口声明下面声明它。

<强> MPPopoverController.h

#import <UIKit/UIKit.h>

@protocol MPPopoverControllerDelegate;

@interface MPPopoverController : UIViewController

@property (nonatomic, assign) id<MPPopoverControllerDelegate> delegate;

@end


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

答案 1 :(得分:2)

编译器读取.m文件,并在必要时加载.h文件。所以它首先加载MPPopoverController.h,当它读取它时,委托协议仍然是未声明的。您可以通过交换包含行来轻松修复此警告。让编译器首先读取委托.h文件。

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

@implementation MPPopoverController
@end

答案 2 :(得分:-1)

你确定你曾经在某个地方包括MPPopoverControllerDelegate.h吗?

答案 3 :(得分:-1)

在MPPopoverController.h和MPPopoverController.h中导入MPPopoverControllerDelegate.h应如下所示:

从问题中粘贴的代码副本已被删除。以下代码是从xcode复制粘贴的。

MPPopoverControllerDelegate.h:

@class MPPopoverController;

@protocol MPPopoverControllerDelegate <NSObject>    

@optional

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

@end

MPPopoverController.h

@protocol MPPopoverControllerDelegate;


@interface MPPopoverController : UIViewController{

    id<MPPopoverControllerDelegate> delegate;
}

@property (nonatomic, assign) id<MPPopoverControllerDelegate> delegate;


@end

MPPopoverController.m

@implementation MPPopoverController

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

问题是在MPPopoverController接口中指定了<MPPopoverControllerDelegate>。这意味着该类实现了这个协议!是错误的,因为该类是协议的所有者。所以你的逻辑在某些方面是错误的。