【问题标题】:Swift Bridging Header import issueSwift 桥接头导入问题
【发布时间】:2014-07-31 13:14:21
【问题描述】:

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

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

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

有人遇到过这个问题吗?

【问题讨论】:

  • 您最好不要自己添加头文件。使用 New File.. 添加一个新的空白 Objective-c .m 文件。这将使 xcode 为您提供一个 header-bridge 文件,您可以在其中添加您的导入。然后可以删除刚刚添加的 .m 文件
  • 是的,我也尝试过这种方式,但没有任何帮助
  • 这是一个新项目还是您手工完成的同一个项目?
  • 这是一个新项目,我已经添加了 Keychain 支持包装器,我曾经在 OBJC 上写过
  • 对不起。不确定添加的钥匙串支持包装器是什么意思。但我注意到你在 iOS 上,你对我一直在使用的 OSX 项目有同样的看法吗

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


【解决方案1】:

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

这是使用测试版软件的乐趣所在。

【讨论】:

  • 是的,这很令人沮丧。我和我的团队正在努力解决 CloudKit 的 NSURL 问题,但我们无法弄清楚为什么会出现错误,结果证明这是苹果的服务器端问题。我们甚至什么都做不了。浪费了这么多时间。哈哈。
  • 这个问题实际上可以通过将标题放置在正确的位置来解决。对我有用的是调用标头 Project-Bridging-Header.h 并将其放在我的项目文件夹树的根目录中(作为我的主要 Xcode 项目文件的兄弟)。见@renan-kosicki 回答
  • 在 Xcode 更新中修复,这是由于早期测试版的问题引起的。
【解决方案2】:

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

Xcode 正在寻找 Project->Header.h

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

希望有所帮助;)

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

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

:D 希望有帮助!

【讨论】:

  • 起初答案是“需要将文件放在 xcodeproj 的同一级别”,最后是“确保文件...不在 xcodeproj 的同一级别”。为什么?
  • 我的意思是该文件必须位于项目的 de 子文件夹中,而不是与 xcodeproj 处于同一级别。示例:在您的项目文件夹中,您有 project、project.xcodeproj 和 projecttests。该文件必须在项目文件夹中:)
  • 伙计们,我不得不这样做。/PATHTOBRIDGINGHEADER/BRIDGINGHEADER
  • 我什么都试过了,但没有什么对我有用。这很烦人。我正在使用 xcode 8 和 swift 3。你能帮帮我吗
  • 我很困惑你说“这意味着你需要把文件放在 xcodeproj 的同一级别!”但是在您说“确保文件位于项目的主文件夹中而不是在 xcodeproj 的同一级别!”之后是哪一个?
【解决方案3】:

找到路径:

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

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

【讨论】:

  • 你赢了。我在这上面浪费了很多时间。简单有效。 Xcode 对这条路径做了一些奇怪的事情,比如在幕后将它附加到 $(SRCROOT) 。我认为在我的道路上有一个空间可能是问题的一部分,但这是灵丹妙药。
  • 你如何删除那个文件?
  • 在 Xcode 8 中 - 而不是“代码生成”,而是在 Swift 编译器-常规中。
  • 谢谢你救了我...非常感谢
【解决方案4】:

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

#import <HexColors/HexColor.h>

而不是

#import "HexColor.h"

【讨论】:

  • 有什么区别?
  • 这对我来说是个问题。我收到“无法导入桥接头”和“找不到 XYZ.h”错误。在 Xcode 6.4 和 Swift 1.2 上进行此更改为我解决了这个问题。
  • @danielgomezrico 一条语句指向子目录中的文件。另一个指向一个不存在的文件。
  • 我在使用 CocoaPods 时出现此错误的解决方案是在创建新配置后再次运行 pod install。
【解决方案5】:

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

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

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

@class MyObject;

【讨论】:

  • 这很愚蠢,但将其移至实现文件也对我有用。不幸的是,我需要在标题中使用它,因为我的类实现了一个在 swift 文件中定义的委托。但是由于 obj-c 不关心我的类在我传入时是否真的实现了委托,所以我会解决这个问题。但理想情况下会有另一种方式
  • 您可能还需要检查您要带入桥接头的那个的导入。如果这些导入的类中的任何一个引用了“-Swift.h”文件,则必须将声明移至 .m。
【解决方案6】:

对于那些在objective-c项目中添加swift类有困难的人。 这对我有用:

  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”

就是这样。现在在你的代码中创建 swift 类,就像它是 Objective-c 一样。

【讨论】:

    【解决方案7】:

    对我来说,这是因为我忘记将它添加到目标的构建设置中。

    【讨论】:

    • 如果您只将它添加到项目的构建设置中,这可能会有所帮助。
    【解决方案8】:

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

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

    【讨论】:

      【解决方案9】:

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

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

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

      【讨论】:

      • 如果您包含链接页面中的详细信息,此答案会更好。如果链接页面发生更改或链接停止工作,阅读此答案的人在遇到第 4 步时将不知道该怎么做。
      【解决方案10】:

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

      【讨论】:

        【解决方案11】:

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

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

        在最后一行设置后,它工作了。

        【讨论】:

          【解决方案12】:

          我从 cocoapods 的桥头文件中导入了一些文件,但方式不正确。

          而不是导入

          #import <SomeCocoaPod/SomeCocoaPod.h>
          

          我写了

          #import "SomeCocoaPod.h"
          

          这是我的大错

          【讨论】:

            【解决方案13】:

            在您的项目中添加一个临时的 Objective-C 文件。你可以给它起任何你喜欢的名字。

            选择 Yes 以配置 Objective-C 桥接头。

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

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

            '#import '

            编辑 AppDelegate.swift 文件:

            func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
            
                GMSServices.provideAPIKey("AIza....") //iOS API key
            
                return true
            }
            

            Follow the link 获取完整示例

            【讨论】:

              【解决方案14】:

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

              【讨论】:

                【解决方案15】:

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

                您可以通过 Window-> Projects 访问该选项。

                【讨论】:

                  【解决方案16】:

                  由于不同的原因我有同样的问题,这是我的情况我构建的项目需要包含滑动菜单,我正在使用 SWRevealViewController lib 来解决这个问题

                  当我导入库文件时,我在 Supporting Files for .h && .m files 下添加了子文件夹(SWRevealViewController),它会引发两个错误,无法导入桥和 SWRevealViewController.h 未找到。

                  我如何解决它

                  当我将文件直接移动到支持文件(删除子文件夹)时,SWRevealViewController.m 自动添加到构建阶段 --> 编译源并且问题消失了

                  【讨论】:

                    【解决方案17】:

                    遇到了上述任何解决方案都无法解决的类似问题。我的项目使用 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,原始错误就消失了。

                    【讨论】:

                      【解决方案18】:

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

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

                      希望这会有所帮助。

                      【讨论】:

                        【解决方案19】:

                        Precompile Bridging Header 设置为 No 为我解决问题。

                        【讨论】:

                        • 为什么投反对票?对于某些人来说,这是一个合法的解决方案。我已经在一个大型项目上对使用此功能进行迭代构建进行了基准测试,并且根本没有发现任何差异(Apple 已经看到了高达 30% 的加速),但是我失去清除构建文件和从头开始构建的时间是可观的
                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2017-06-21
                        • 1970-01-01
                        • 1970-01-01
                        • 2014-11-24
                        • 1970-01-01
                        • 2015-11-03
                        相关资源
                        最近更新 更多