我有一个用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&#39 ;;你的意思是' UINavigationController'?"
有谁知道它为什么不识别这种类型?
答案 0 :(得分:22)
在Objective-C代码中,您可以导入自动生成的-Swift.h
标头。在相同的代码中,之前 #import
行,插入#import "CustomNavigationController.h"
。这两个#import
语句的顺序至关重要!
这将通过确保CustomNavigationController在自动生成的-Swift.h
标头之前位于命名空间中来解决问题,因此后者将了解前者并且一切都会很好。
如果Objective-C类不需要了解CustomNavigationController,这会令人烦恼,但它可以解决前面的问题并允许您继续使用混合项目。
答案 1 :(得分:6)
看起来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"
答案 2 :(得分:4)
如果您无法通过更改上述答案所建议的#import
语句的顺序来解决问题,则检查ProjectName-Bridging-Header.h
中缺少框架导入的文件可能会有效。
就我而言,我在其中一种方法中使用UIImage
的桥接头文件中有一个类。当我的项目完全由Objective-C组成时工作正常但在将此标题暴露给Swift时,我必须添加#import <UIKit/UIKit.h>
才能删除错误。
答案 3 :(得分:0)
试试这个:
navController = self.storyboard.instantiateViewControllerWithIdentifier("CustomNavigationController") as? CustomNavigationController
答案 4 :(得分:0)
我遇到了同样的情况。在我的情况下,编辑&gt;在所有目标中将swift版本更新为3.0后解决了错误转换&gt;当前的Swift语法。希望它有所帮助