如何处理交叉导入?

时间:2012-02-17 09:04:14

标签: objective-c cocoa-touch

我在Xcode中创建了一个新项目作为单视图iOS应用程序。我创建了一个名为WebView的自定义类,扩展了UIWebView。在故事板中,我将一个WebView添加到ViewController,然后在ViewController.h中为WebView创建一个IBOutlet。我没有使用UIWebView类作为IBOutlet,而是使用我的cusom WebView类,并在ViewController.h中导入它的头文件。现在我的ViewController连接到WebView类的Web VIew。

接下来,我希望我的WebView能够引用UIViewController。然后我在我的WebView.h中导入ViewController.h,但后来我开始遇到一些编译器错误,如:

  

未知类型名称'WebView';你的意思是'UIWebView'吗?

我猜问题是,ViewController.h导入WebView.h并且WebView.h导入ViewController.h。是不是可以在Objective-C中进行交叉导入?

2 个答案:

答案 0 :(得分:10)

在WebView.h和ViewController.h中,您应该预先声明所需的类,而不是导入每个文件,然后在.m(实现)文件中进行实际导入。

<强> WebView.h

@class ViewController; // This pre-declares ViewController, allowing this header to use pointers to ViewController, but not actually use the contents of ViewController

@interface WebView : UIWebView
{
   ViewController* viewController;
}

@end

<强> WebView.m

#import "WebView.h"
#import "ViewController.h" // Gives full access to the ViewController class

@implementation WebView


- (void)doSomething
{
   [viewController doSomethingElse];
}

@end

答案 1 :(得分:2)

您无需导入标头即可进行简单参考。相反,您可以使用

声明该类
@class WebView;

在界面中,这足以让编译器创建一个Outlet。当您想要访问该类的属性或方法时,您只需要完整的标题。