17

我有一个用 swift 编写的 CustomViewController 类和一个用 Objective C 编写的 CustomNavigationController 类。我正在尝试将我的 CustomNavigationController 作为属性添加到我的 CustomViewController。我已经添加#import "CustomNavigationController.h"到我的桥接头中。

在我的 CustomViewController 我有:

class CustomViewController: UIViewController {

    var navController: CustomNavigationController?
...
//init methods


...


 override func viewDidLoad() {
        super.viewDidLoad()

        //Set up Navigation Controller
        navController = self.storyboard.instantiateViewControllerWithIdentifier("CustomNavigationController") as CustomNavigationController!
}

在我尝试构建和运行之前没有错误......我得到“未知类型名称'CustomNavigationController';你的意思是'UINavigationController'吗?”

有谁知道为什么它不识别类型?

4

5 回答 5

24

在您的 Objective-C 代码中,您正在某个地方导入自动生成的-Swift.h标头。在同一代码中,#import行之前,插入#import "CustomNavigationController.h". 这两个#import语句的顺序至关重要!

这将通过确保 CustomNavigationController 位于自动生成的-Swift.h标头之前的名称空间中来解决问题,因此后者将知道前者并且一切都会好起来的。

如果该 Objective-C 类不需要了解 CustomNavigationController,这有点令人烦恼,但它解决了未来的问题并允许您继续使用您的混合项目。

于 2014-06-14T04:57:39.320 回答
8

看起来ProjectName-Swift.h生成的头文件不会自动包含ProjectName-Bridging-Header.h. 这会导致在导入之前尚未声明的任何类型在编译器ProjectName-Swift.h中引发错误。Unknown type name这似乎是一个错误。

我的解决方法是创建该转发的替代版本ProjectName-Swift.h,声明导致错误的类,然后导入ProjectName-Swifth.h。我叫它ProjectName-Swift-Fixed.h。对我来说,ProjectName-Swift-Fixed.h看起来像这样:

// ProjectName-Swift-Fixed.h
@class CustomViewController;
#import "ProjectName-Swift.h"

然后,在我拥有的代码中的任何地方,我都#include "ProjectName-Swift.h"将其替换为#include "ProjectName-Swift-Fixed.h"

于 2014-06-12T22:23:53.167 回答
5

#import如果您无法按照上述答案的建议通过更改语句的顺序来解决问题,检查您的文件中ProjectName-Bridging-Header.h是否缺少框架导入可能会起作用。

就我而言,我在桥接头文件中有一个类,该类在UIImage其中一种方法中使用。当我的项目仅由运行良好的 Objective-C 组成时,但是当将此标头暴露给 Swift 时,我必须添加#import <UIKit/UIKit.h>以消除错误。

于 2016-01-19T11:48:38.383 回答
0

尝试这个:

navController = self.storyboard.instantiateViewControllerWithIdentifier("CustomNavigationController") as? CustomNavigationController
于 2014-06-07T16:52:31.190 回答
0

我遇到了同样的情况。在我的情况下,在所有目标中通过 Edit > Convert > To Current Swift Syntax 将swift 版本更新为 3.0 后,错误得到解决。希望能帮助到你

于 2016-11-29T02:54:51.470 回答