UIViewController调用彼此的委托

时间:2011-05-22 06:53:58

标签: iphone objective-c ipad

我有两个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.

我知道这可能是由于圆柱引用,但我该如何解决?

3 个答案:

答案 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文件中导入此文件。 这将打破这个循环。