【问题标题】:How to handle cross import?如何处理交叉导入?
【发布时间】:2012-02-17 09:04:13
【问题描述】:

我在 Xcode 中创建了一个作为单视图 iOS 应用程序的新项目。我创建了一个名为 WebView 的自定义类来扩展 UIWebView。在情节提要中,我向 ViewController 添加了一个 WebView,然后在 ViewController.h 中为 WebView 制作了一个 IBOutlet。我没有为 IBOutlet 使用 UIWebView 类,而是使用了我的 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中不能交叉导入吗?

【问题讨论】:

    标签: objective-c cocoa-touch


    【解决方案1】:

    在 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
    

    【讨论】:

      【解决方案2】:

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

      声明该类
      @class WebView;
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-23
        • 2018-10-05
        • 2018-09-09
        • 2011-02-26
        • 1970-01-01
        • 2018-10-22
        • 2010-10-30
        • 2017-11-03
        相关资源
        最近更新 更多