我有两个view controllers A
和B
,它们彼此都有自己的代理。
当我除了在头文件的开头定义协议和#import
对方的头文件之外什么也不做时,我得到了两个关于以下内容的错误:
找不到"BDelegate“的协议声明,它显示在A.h (我写的地方)找不到"ADelegate”的协议声明,它显示在B.h (我写的地方)
在网上看一看,人们早些时候写道,头文件的循环包含可能导致了问题。他们建议使用#include
,或者像这样的@class
声明-
@class A
而不是
#import A.h
#import B.h
内幕
我尝试了几乎所有这些导入的组合,以及@classes
和#include
,但仍然无法摆脱警告。此外,在线解决方案建议将#import
移动到.m
文件,但这也没有帮助。部分原因是网上的解决方案有点模糊--如果你能把它分解一下,那就太好了。
有什么建议可以解决这个问题吗?
-- BigViewController.h --
#import "BaseViewController.h"
#include "BaseViewController.h"
@class BigViewController;
@protocol BigViewControllerDelegate
-(void) BigViewController:(BigViewController *) bigView;
@end
@interface BigViewController : UIViewController <BaseViewControllerDelegate>
{
//delegate
id <BigViewControllerDelegate> delegate;
ivars...
}
@properties...
@end
--------------------------------------------------
-- BaseViewController.h --
#<UIKit/UIKit.h>
#import "BigViewController.h"
#include "BigViewController.h"
@class BigViewController;
@protocol BaseViewControllerDelegate
- (void) setParametersWithItemChosen:(Item *) item;
@end
@interface BaseViewController : UIViewController <...BigViewControllerDelegate...>
{
ivars...
//delegate
id <BaseViewControllerDelegate> delegate;
}
@properties...
@end
发布于 2011-06-23 07:49:23
让我进一步减少样本,并标记这些行:
VC1.h
#import "VC2.h" // A
@class VC1;
@protocol VC1Delegate // B
@end
@interface VC1 : UIViewController <VC2Delegate> // C
@end
VC2.h
#import "VC1.h" // D
@class VC2;
@protocol VC2Delegate // E
@end
@interface VC2 : UIViewController <VC1Delegate> // F
@end
考虑一下当某件东西导入VC1.h时会发生什么:它到达A行,然后导入被处理。行D不执行任何操作,因为已经导入了VC1.h。然后处理E行。然后是F行,我们得到一个错误,因为我们还没有到达B行,所以协议没有声明!
然后考虑一下,当某件东西导入VC2.h时会发生什么:它到达D行,然后导入被处理。线路A不执行任何操作,因为已经导入了VC2.h。然后处理行B。然后是C行,我们得到一个错误,因为我们还没有到达E行,所以协议没有声明!
第一步是重新考虑这两个类是否真的需要成为对方的代理。如果你能打破这个循环,那可能就是你要走的路。如果不是,您将需要重新构造您的头。最直接的方法可能是将委托放入它们自己的头中:
VC1Delegate.h
@class VC1;
@protocol VC1Delegate // B
@end
VC1.h
#import "VC1Delegate.h"
#import "VC2Delegate.h"
@interface VC1 : UIViewController <VC2Delegate> // C
@end
VC2Delegate.h
@class VC2;
@protocol VC2Delegate // E
@end
VC2.h
#import "VC1Delegate.h"
#import "VC2Delegate.h"
@interface VC2 : UIViewController <VC1Delegate> // F
@end
如果您现在跟踪导入,您将看到在@interface行尝试使用它们之前,将始终声明适当的协议。
发布于 2013-01-22 14:23:17
在#import行上编写协议声明代码,例如
@协议
@end
导入
@interface类名称
发布于 2012-04-11 19:25:05
我遇到了几乎相同的问题,多亏了上面的答案,我解决了它,但方式略有不同。
我所做的就是将#行放在头文件中的协议声明之后。希望我能帮上忙。如果有人因为某些原因知道这是糟糕的编程,请让我知道
https://stackoverflow.com/questions/6447573
复制相似问题