我有两个UIViewController,每个都有它的委托,并且正在调用其中一个。一个类称为TopicViewController,另一个类是MentionViewController,代码如下所示:
#import <UIKit/UIKit.h>
#import <QuartzCore/QuartzCore.h>
#import <RestKit/RestKit.h>
#import "Message.h"
#import "Imgur.h"
#import "URLViewController.h"
#import "CVore.h"
#import "NSData+Base64.h"
#import "Imgur.h"
#import "ProfileViewController.h"
#import "OptionsViewController.h"
#import "Three20/Three20.h"
@class DetailViewController;
@class MentionViewController;
@protocol DetailViewControllerDelegate
- (void) viewController:(DetailViewController*)viewCon withText:(NSString *) text;
@end
@interface DetailViewController : UIViewController <MentionViewControllerDelegate>
///////////////////////////////////////////////////////////////////////////////////
#import <UIKit/UIKit.h>
#import <RestKit/RestKit.h>
#import "Members.h"
#import "DetailViewController.h"
#import "Three20/Three20.h"
@class MentionViewController;
@protocol MentionViewControllerDelegate
- (void) viewController:(MentionViewController*)viewCon withUsername:(NSString *) text;
@end
@interface MentionViewController : UITableViewController <DetailViewControllerDelegate>
现在问题是,当我将#import“MentionViewController.h”添加到DetailViewController时,它在MentioViewController中给出了以下错误:
Cannot find protocol declaration for DetailViewControllerDelegate.
我知道这可能是由于圆柱引用,但我该如何解决?
答案 0 :(得分:9)
真的很奇怪。 MentionViewController需要DetailViewController的头文件,而DetailViewController需要MentionViewController的头文件。 It is a cycle
。也许您需要创建一个空头文件,并将所有协议放在其中。例如,
MyProtocol.h
@class DetailViewController;
@class MentionViewController;
@protocol DetailViewControllerDelegate
- (void) viewController:(DetailViewController*)viewCon withText:(NSString *) text;
@end
@protocol MentionViewControllerDelegate
- (void) viewController:(MentionViewController*)viewCon withUsername:(NSString *) text;
@end
在DetailViewController.h和MentionViewController.h中添加#import MyProtocol.h
。
答案 1 :(得分:5)
您需要使用协议的前向声明,并且只导入实现文件中的标头。
答案 2 :(得分:1)
我认为你的直觉是正确的。
您应该能够通过在自己的头文件中声明2个协议来解决此问题,然后从.m文件中导入此文件。 这将打破这个循环。