Предупреждение о декларации протокола - PullRequest
1 голос
/ 06 февраля 2012

Файл 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 'все будет хорошо.Но ссылка - в разделе «Что касается других протоколов» вы можете видеть, что Apple говорит использовать @ protocol

Ответы [ 4 ]

2 голосов
/ 06 февраля 2012

Компилятор читает ваш файл .m и загружает файлы .h при необходимости.Таким образом, сначала загружается MPPopoverController.h, а когда он читает, протокол делегата все еще не объявленВы можете легко исправить это предупреждение, просто поменяв строки включения.Чтобы позволить компилятору сначала прочитать файл делегата .h.

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

@implementation MPPopoverController
@end
2 голосов
/ 06 февраля 2012

Есть ли абсолютная необходимость в объявлении протокола в другом заголовочном файле?Если это не очень большое определение протокола (которое не является вашим), я бы посоветовал объявить его под объявлением интерфейса.

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
0 голосов
/ 06 февраля 2012

Импорт MPPopoverControllerDelegate.h в MPPopoverController.h и MPPopoverController.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>.Это означает, что класс реализует этот протокол!Это неправильно, потому что класс является владельцем протокола.Так что ваша логика в какой-то момент неверна.

0 голосов
/ 06 февраля 2012

Вы уверены, что когда-нибудь где-нибудь включали MPPopoverControllerDelegate.h?

...