Swift桥接标题导入问题


123

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

:0:错误:无法导入Objective-C标头'---标头/....h'的路径

屏幕截图1

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

有人遇到过这个问题吗?


您可能要自己添加头文件。使用“新文件..”添加新的空白Objective-c .m文件。这将使xcode为您提供一个头桥文件,您可以在其中添加导入。然后,您可以删除您刚才添加的.m文件
markhunte

是的,我当然也尝试过这种方法,但没有任何帮助
Nikita Pronchik 2014年

这是在一个新项目上还是您手工完成的一个项目?
markhunte 2014年

这是一个新项目,我添加了钥匙串支持包装,这是我曾经在OBJC上写的
Nikita Pronchik 2014年

抱歉。不确定添加的钥匙串支持包装程序是什么意思。但是我注意到您在iOS上,我使用的OSX项目也得到了同样的效果
markhunte 2014年

Answers:


153

注意将文件添加到您的错误所在的文件夹中!我犯了同样的错误,如果您从Xcode创建文件,它将进入以下文件夹:Project-> Project-> Header.h

Xcode正在寻找Project-> Header.h

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

希望能有所帮助;)

更新:我不确定我是否明白您的意思,但是请尝试通过以下方法解决您的问题:
1.删​​除您到目前为止创建的所有桥接文件。
2.选择项目的主文件夹,然后单击新文件-> iOS-> Header文件。
3.将导入内容写入创建的头文件中。
4.在Xcode-> Build Settings中选择项目,在搜索字段中键入:bridged,然后在密钥SWIFT_OBJC_BRIDGING_HEADER中输入标题文件的名称或路径!

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

:D希望有帮助!


好吧,我刚刚尝试过这种方法,标题确实是可见的,但是,不幸的是,桥接Obj-C类仍然不可见(在将它们包含在桥接标题中之后)
Nikita Pronchik 2014年

11
首先,答案是“需要将文件放在xcodeproj的同一级别上”,最后,答案是“确保文件...不在xcodeproj的同一级别上”。为什么?
Boon 2014年

3
我的意思是该文件必须位于项目的de子文件夹中,而不是与xcodeproj处于同一级别。示例:在项目的文件夹中,您有项目project.xcodeproj和projecttests。该文件必须位于项目文件夹中:)
Renan Kosicki 2014年

5
我尝试了一切,但nothnig对我有用。这很烦人。我正在使用xcode 8和swift3。您能帮我吗
Hardik Shah

1
我很困惑,您说:“这意味着您需要将文件放在xcodeproj的同一级别上!” 但在您说“确保文件位于项目的主文件夹中之后,不要在同一级别的xcodeproj中!” 哪一个?
巴卡洛洛

68

就我而言,这实际上是循环引用导致的错误。我在桥接头文件中导入了一个类,而该类的头文件正在导入swift头文件(<MODULE_NAME>-Swift.h)。我这样做是因为在Obj-C头文件中,我需要使用在Swift中声明的类,因此解决方案是仅使用@class声明性代码。

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

检查此文件时,我注意到它在标头中声明了-Swift.h。将此导入移动到实施中可以解决此问题。所以我需要使用一个对象,让我们MyObject在Swift中定义它,所以我只是简单地将标题更改为

@class MyObject;

1
这很愚蠢,但是将其移到实现文件中对我也起作用。不幸的是,我在标头中需要它,因为我的类实现了在swift文件中定义的委托。但是由于obj-c不在乎我的类在传递时是否真正实现了委托,因此我将为此解决。但理想情况下,还有另一种方式
Oren 2015年

您可能还必须检查要带入桥接头文件的导入。如果这些导入的类中的任何一个都有对“ -Swift.h”文件的引用,则必须将声明移至.m。
Kyle Carruthers

30

在以下位置找到路径:

构建设置/快速编译器-代码生成/ Objective-C桥接头

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


2
你赢了。我为此浪费了很多时间。简单有效。Xcode对此路径做了一些棘手的事情,例如将其追加到幕后的$(SRCROOT)中。我认为在路径中留出空间可能是问题的一部分,但这是灵丹妙药。
2015年

1
您如何删除该文件?
Jacky Wang

7
在Xcode 8中-而不是“代码生成”,它在Swift Compiler-General中。
Vivek Bansal

谢谢您救救我...非常感谢
Vijay Rathod 18-3-18

18

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

#import <HexColors/HexColor.h>

而不是

#import "HexColor.h"

2
有什么不同?
Daniel Gomez Rico

这是我的问题。我收到“无法导入桥接头”和“找不到XYZ.h”错误。进行此更改可以在Xcode 6.4和Swift 1.2上为我解决。
Entalpi

1
@danielgomezrico一个语句指向子目录中的文件。其他指向不存在的文件。
Casey Murray

使用CocoaPods时,此错误的解决方法是在创建新配置后再次运行pod install。
打字机

16

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

您可以从Window-> Projects到达该选项。




6

我也遇到了这个问题,可悲的是,这只是SDK + Xcode中的错误。我与WWDC的工程师进行了交谈,谈到了这个问题以及CloudKit遇到的其他一些问题。这些错误将在Xcode的下一个种子中解决。

这是使用Beta版软件的有趣部分。


1
是的,令人沮丧。我和我的团队一直在努力找出CloudKit的NSURL问题,但我们无法弄清楚为什么会出错,事实证明,这确实是服务器方面的问题。我们什至无能为力。浪费了很多时间。哈哈。
douglas bumby

5
通过将标题放置在正确的位置,实际上可以解决此问题。对我有用的是调用标题Project-Bridging-Header.h并将其放在我的项目文件夹树的根中(作为我的主要Xcode项目文件的同级文件)。参见@ renan-kosicki答案
jb

1
在Xcode更新中已修复,这是由于早期Beta版存在问题引起的。
douglas bumby

3

对于那些难以将快速类添加到Objective-C项目中的人。这是对我有用的:

  1. 创建新的swift文件。如果您希望xcode为mix swift-objective-c项目创建所有设置(包括brigde-header.h),这将使xcode提示。按是。
  2. 现在,添加要在项目中使用的现有swift文件。
  3. 在实现文件中,您将使用swift类添加:#import“ YOURPROJECTNAME-swift.h”。此文件xcode为您创建。如果您的xcode项目是myProject,则为“ myProject-swift.h”

就是这样。现在像在Objective-C中一样在您的代码中创建swift类。



2

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

选择是,配置一个Objective-C桥接头。

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

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

'#import <GoogleMaps / GoogleMaps.h>'

编辑AppDelegate.swift文件:

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

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

    return true
}

点击链接获取完整示例


2

对我来说,添加框架时没有在目标路径中选择“如果需要复制项目”。只需选择此选项即可重新添加框架。


1

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

  1. 在您的项目下添加Facebook框架-FBSDKCoreKit,FBSDKLoginKit。
  2. 无需更改构建设置,因为FB SDK v4.1及更高版本不再需要桥接头文件。
  3. 在ViewController.swift,AppDelegate.swift文件中导入FBSDKCorekit,FBSDKLoginKit
  4. 如此处所述 pList中添加信息

  5. 构建您的应用。哇!没有编译时错误。


2
如果您包含了链接页面的详细信息,则此答案会更好。如果链接的页面改变或链接停止工作,人们阅读这个答案不知道他们什么时候遇到第4步做什么
TNT

1

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

导入库文件时,在.h && .m文件的支持文件下添加子文件夹(SWRevealViewController),它会引发两个错误,无法导入bridge和SWRevealViewController.h。

我如何解决

当我直接将文件移动到Supporting Files(删除子文件夹)时,SWRevealViewController.m自动添加到Build Phases-> Compile Sources,问题消失了

在此处输入图片说明


1

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

您唯一需要做的就是删除或更改扩展名的桥接头的名称,一切都很好。

希望这会有所帮助。


0

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

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


0

在其他修复程序中,尝试执行Product-> Archive时出现错误。原来我有这个:

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

在最后一行中对其进行设置后,它可以工作。


0

遇到类似的问题,上述任何解决方案都无法解决。我的项目使用CocoaPods。我注意到随着错误我收到以下消息警告:

Uncategorized: Target 'Pods' of project 'Pods' was rejected as an implicit dependency for 'Pods.framework' because its architectures 'arm64' didn't contain all required architectures 'armv7 arm64'

在此处输入图片说明

因此解决方案非常简单。对于Pods项目,将Build Active Architecture Only标记更改为No,并且原始错误消失了。


0

将“ 预编译桥接头”设置为“ 解决我的问题”。


为什么要下票?对于某些人来说,这是一个合法的解决方案。我已经在大型项目中启用和禁用了迭代构建的基准测试,完全没有区别(Apple看到了高达30%的提速),但是我失去了清除构建文件和从头开始构建的时间,这是可观的
Alexandre G
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.