Swift Bridging Header导入问题

时间:2014-06-10 16:51:32

标签: ios swift xcode6 objective-c-swift-bridge

按照说明,我创建了一个桥接标题并添加到我的项目中。不幸的是,发生了以下错误:

  

:0:错误:无法导入Objective-C标题'--- path - to --- header / .... h'

Screenshot 1

在构建设置中,我将标题搜索路径字符串添加到桥接标题的位置,但没有任何帮助。

有没有人遇到过这个问题?

19 个答案:

答案 0 :(得分:145)

小心将文件添加到错误抱怨的文件夹中! 我犯了同样的错误,如果你从Xcode创建文件,它将转到文件夹:Project-> Project-> Header.h

Xcode正在寻找Project-> Header.h

这意味着您需要将文件放在项目文件夹中(ProjectName-> ProjectNameFolder)!

希望有所帮助;)

更新: 我不确定我是否明白你的意思,但试着用它来解决你的问题:
1.删​​除您创建的所有桥接文件,直到现在 2.选择项目的主文件夹并点击新文件 - > iOS->标题文件 3.在创建的头文件中写入您的导入 4.在Xcode-> Build Settings中选择项目,输入搜索字段:桥接并输入密钥SWIFT_OBJC_BRIDGING_HEADER头文件的名称或其路径!

如果您按照此步骤操作,您的头文件将在正确的位置创建!

:D希望有所帮助!

答案 1 :(得分:66)

在我的情况下,这实际上是循环引用的错误。我在桥接头中导入了一个类,该类的头文件正在导入swift头(<MODULE_NAME>-Swift.h)。我这样做是因为在Obj-C头文件中我需要使用在Swift中声明的类,解决方案是简单地使用@class声明。

所以基本上错误说“无法导入桥接头”,上面的错误表示找不到<MODULE_NAME>-Swift.h文件,上面是指向特定Obj-C头文件(即视图控制器)的错误

检查这个文件我注意到它在头文件中声明了-Swift.h。将此导入移动到实现解决了该问题。所以我需要使用一个对象,让我们调用它在Swift中定义的MyObject,所以我只是改了标题来说

@class MyObject;

答案 2 :(得分:30)

在以下位置找到路径:

构建设置/ Swift编译器代码生成/ Objective-C桥接标题

并删除该文件。那你应该没事。

答案 3 :(得分:17)

这可能只影响一小部分人,但在我的情况下,我的项目是使用CocoaPods,其中一个pod有一个带有自己的CocoaPods的子规范。解决方案是使用全角度导入来引用子窗格中的任何文件。

#import <HexColors/HexColor.h>

而不是

#import "HexColor.h"

答案 4 :(得分:14)

对于我删除派生数据修复它,我注意到即使我从旧提交中签出,也会发生同样的问题。

您可以通过Window-&gt;达到该选项。项目。

答案 5 :(得分:9)

“我们需要告诉 Xcode 在哪里查找我们在桥接标题中列出的标题文件。查找搜索路径部分,并更改用户标题搜索路径的项目级设置,为“Pods”目录添加递归条目: Pods / **“ http://swiftalicio.us/2014/11/using-cocoapods-from-swift/

答案 6 :(得分:9)

对我来说,这是因为我忘了将它添加到Target的Build Settings中。

enter image description here

答案 7 :(得分:6)

我也遇到过这个问题,遗憾的是它只是SDK + Xcode中的一个错误。我和WWDC的一位工程师谈过这个以及我在使用CloudKit时遇到的其他一些问题。这些错误将在Xcode的下一个种子中得到解决。

使用测试版软件很有趣。

答案 8 :(得分:3)

其他有麻烦的人将swift类添加到objective-c项目中。 这对我有用:

  1. 创建新的swift文件。这将使xcode提示你是否希望xcode为mix swift-objective-c项目创建包括brigde-header.h的所有设置。按是。
  2. 现在,添加您要在项目中使用的现有swift文件。
  3. 在实现文件中,您将使用swift类添加: #import“YOURPROJECTNAME-swift.h”。这个文件xcode为你创建。 如果您的xcode项目是myProject,那么“myProject-swift.h”
  4. 就是这样。现在在代码中创建swift类,就像它是objective-c。

答案 9 :(得分:2)

我从cocoapods的bridgin头文件导入的某些文件不是以正确的方式。

而不是导入

#import <SomeCocoaPod/SomeCocoaPod.h>

我写了

#import "SomeCocoaPod.h"

这是我的巨大错误

答案 10 :(得分:2)

将临时Objective-C文件添加到项目中。你可以给它任何你喜欢的名字。

选择“是”以配置Objective-C桥接标头。

删除刚刚创建的临时Objective-C文件。

在刚创建的projectName-Bridging-Header.h文件中,添加以下行:

'#import&lt; GoogleMaps / GoogleMaps.h&gt;'

编辑AppDelegate.swift文件:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    GMSServices.provideAPIKey("AIza....") //iOS API key

    return true
}

Follow the link获取完整样本

答案 11 :(得分:2)

对我而言,如果需要,我们不会选择复制项目&#39;在添加框架时的目标路径中。只需选择此选项即可重新添加框架。

答案 12 :(得分:1)

经过最初几天的努力,我终于成功地将Facebook注册功能集成到了我的iOS应用程序中。以下是步骤(我假设您已经在您的机器中安装了Facebook SDK v4.1或更高版本):

  1. 在您的项目下添加Facebook框架 - FBSDKCoreKit,FBSDKLoginKit。
  2. 在Build SDK设置中不做任何更改,因为FB SDK v4.1及更高版本不再需要桥接头文件。
  3. 在ViewController.swift,AppDelegate.swift文件中导入FBSDKCorekit,FBSDKLoginKit
  4. 按照here

  5. 所述在pList中添加信息
  6. 构建您的应用。哇哦!没有编译时错误。

答案 13 :(得分:1)

由于不同的原因,我有同样的问题,这是我的情况我构建需要包含幻灯片菜单的项目,我使用SWRevealViewController lib来接近

当我导入库文件时,我在支持文件下为.h&amp;&amp;添加了子文件夹(SWRevealViewController)。 .m文件,它会触发两个错误,无法导入桥和SWRevealViewController.h。

我如何解决

当我直接将文件移动到支持文件(删除子文件夹)时,SWRevealViewController.m自动添加到Build Phases - &gt;编译来源和问题已经消失

enter image description here

答案 14 :(得分:1)

当我向我的应用添加今日扩展时,我遇到了这种错误。生成扩展的构建目标时使用与我的应用程序构建目标相同的桥接头名称。这导致了错误,因为扩展程序没有看到我的应用程序的桥接标题中列出的文件。

您唯一需要做的就是删除或更改扩展程序的桥接标题的名称,一切都会好的。

希望这会有所帮助。

答案 15 :(得分:0)

我实际上在项目下创建了一个空的OSX Source Objective C文件(我所有的swift文件都在这里)。

我添加了导入,然后删除了 .m 文件。

答案 16 :(得分:0)

在其他修复程序中,当我尝试执行Product-&gt; Archive时出现错误。事实证明我有这个:

Objective-C Bridging Header
  Debug (had the value)
  Release (had the value)
    Any architecture | Any SDK (this was blank - problem here!)

在最后一行设置之后,它就可以了。

答案 17 :(得分:0)

有类似的问题无法通过上述任何解决方案解决。我的项目使用CocoaPods。我注意到,随着错误,我收到了一条警告,其中包含以下消息:

double size = label.getFont().getSize()

enter image description here

所以解决方案非常简单。对于Pods项目,将 Build Active Architecture Only 标记更改为,原始错误消失。

答案 18 :(得分:0)

预编译桥接标题设置为为我解决问题。