Xcode MyProjectName-Bridging-Header.h不存在


118

我想在我的Objective-C项目中开始使用Swift。所以我增加了一个快速班:

import Foundation
@objc class System : NSObject {
    @objc func printSome() {
        println("Print line System");
    }
}

并将其导入到.m文件中:

#import "MyProjectName-Swift.h"

在构建我的项目时,出现以下错误:

Bridging header 'PathToMyProject/MyProjectName-Bridging-Header.h' does not exist

注意:在“构建设置-> Swift编译器-代码生成-> Objective-C桥接标题”下设置为MyProjectName-Bridging-Header.h

我应该怎么做才能解决这个问题?

任何帮助深表感谢。

编辑:桥接头文件:#if defined(__ has_include)&& __has_include()#include #endif

#include <objc/NSObject.h>
#include <stdint.h>
#include <stddef.h>
#include <stdbool.h>

#if defined(__has_include) && __has_include(<uchar.h>)
# include <uchar.h>
#elif __cplusplus < 201103L
typedef uint_least16_t char16_t;
typedef uint_least32_t char32_t;
#endif
#if !defined(SWIFT_PASTE)
# define SWIFT_PASTE_HELPER(x, y) x##y
# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y)
#endif
#if !defined(SWIFT_METATYPE)
# define SWIFT_METATYPE(X) Class
#endif

#if defined(__has_attribute) && __has_attribute(objc_runtime_name)
# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X)))
#else
# define SWIFT_RUNTIME_NAME(X)
#endif
#if !defined(SWIFT_CLASS_EXTRA)
# define SWIFT_CLASS_EXTRA
#endif
#if !defined(SWIFT_PROTOCOL_EXTRA)
# define SWIFT_PROTOCOL_EXTRA
#endif
#if !defined(SWIFT_CLASS)
# if defined(__has_attribute) && __has_attribute(objc_subclassing_restricted) 
#  define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA
# else
#  define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
# endif
#endif

#if !defined(SWIFT_PROTOCOL)
# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA
#endif

#if !defined(SWIFT_EXTENSION)
# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__)
#endif

#if !defined(OBJC_DESIGNATED_INITIALIZER)
# if defined(__has_attribute) && __has_attribute(objc_designated_initializer)
#  define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer))
# else
#  define OBJC_DESIGNATED_INITIALIZER
# endif
#endif
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch"

#if defined(__has_feature) && __has_feature(modules)
#endif

#pragma clang diagnostic pop

2
MyProjectName-Swift.hMyProjectName-Bridging-Header.h朝相反的方向工作。MyProjectName-Swift.h是自动提供的。MyProjectName-Bridging-Header.h,但是是半自动提供的,即您必须确保它在那里。因此,您确定可以MyProjectName-Bridging-Header.h在项目导航器中看到吗?如果没有,请创建一个具有该名称的文件并将其添加到您的项目中。然后再次检查,在生成设置它的路径是正确的(它应该包括项目目录:MyProjectName/MyProjectName-Bridging-Header.h
米洛斯

您是否检查过产品模块名称不为空?(构建设置->包装->产品模块名称)
Nina 2014年

妮娜,是的,我的模块名称是“ MyProjectName”,而不是其他东西
user2408952 2014年

milos,我以为Xcode应该会自动生成此桥接文件。所以不,我的项目中没有该文件。
user2408952 2014年

1
您是否手动指定了Bridging-Header.h?我知道,有一个拼写错误“编织”
Nina

Answers:


191

如果桥接文件是在与其他类相同的级别上创建的,则可能需要添加相对路径,如这些图片所示。请注意,桥接文件是在与其他类相同的级别上创建的: 在此处输入图片说明

我在“构建设置”中输入了正确的名称, 在此处输入图片说明

但是编译器找不到该文件。 在此处输入图片说明

因此,如果我从项目的根目录添加相对路径(即,我添加./ProjectName/BridgerFileName.h), 在此处输入图片说明

现在它可以编译了,我可以在我的Objective C类中调用一个方法: 在此处输入图片说明


4
对我来说,它根本无法解决。看起来XCode对更新的Objective-C桥接标头字段没有反应。
Darius Miliauskas'3

花了很长时间让我找到,但最后。谢谢,解决了错误:)
AndersSørensen'17

表现很好!是的,不要忘了在项目构建设置和目标构建设置中都执行此操作。
Akash Bhardwaj

72

我发现手动创建桥接头文件并选择默认名称和位置后,桥接头将放置在项目目录中,该目录位于根目录下。

这需要以下值进行设置:目标> [您的应用程序目标]>构建设置> Swift编译器-代码生成> Objective-C桥接头

$(SRCROOT)/$(PROJECT_NAME)/$(PROJECT_NAME)-Bridging-Header.h 

请注意,如果您的项目是快速模块(框架),那么,正如注释中指出的那样,您可能更喜欢:

$(SRCROOT)/$(PROJECT_NAME)/$(SWIFT_MODULE_NAME)-Bridging-Header.h

2
$(SRCROOT)/$(PROJECT_NAME)/$(SWIFT_MODULE_NAME)-Bridging-Header.h会更常见:)
gaussblurinc 2015年

1
这应该是唯一的答案!
卡·达万佐

$(SRCROOT)/$(PROJECT_NAME)/$(SWIFT_MODULE_NAME)-Bridging-Header.h到我的项目文件夹,我得到了正确的路径,但/$(PROJECT_NAME)没有将我带到所需的路径。
iPeter

注意其他可能遇到相同问题的人-当我复制/粘贴@gaussblurinc注释时,在字符串的“标题”部分复制了一些奇怪的字符。从答案中复制/粘贴相同的字符串后,它工作正常。
亚当·约翰斯

46

对于那些正在删除桥接头的人

我和其他大多数答案都相反。我以前一直在使用桥接头,但现在不再需要它了。从项目中删除它后,我开始收到问题中提到的错误。我执行了以下步骤来解决我的问题。

  1. 转到目标> [您的应用程序目标]>构建设置> Swift编译器-常规> Objective-C桥接标题,然后删除路径。(感谢@Donamite提出这个想法。)(您只需在搜索框中输入“桥接”即可找到它。)
  2. 删除派生日期。转到“ Xcode”>“首选项”>“位置”,然后单击“派生数据”文件夹旁边的灰色箭头。然后删除您的项目文件夹。

在此处输入图片说明


22

Swift 4.1中

您的项目中没有bridging-Header.h文件,但是您的项目中有该路径。为此,您需要删除该路径...

转到targets文件并选择Build Settings,----> Swift Compiler - General,然后删除bridging-Header.h。请按照下面的屏幕截图...。在此处输入图片说明

bridging-Header.h在Swift编译器中删除文件-常规

在此处输入图片说明

现在你像这样...

在此处输入图片说明


14

在Swift项目中添加Bridge File。

步骤1.转到文件>使用Objective-C文件添加可可(临时用途)

在此处输入图片说明

步骤2.然后将出现以下弹出窗口在此处输入图片说明

现在按创建桥接标题按钮

DONE
你会得到多桥文件捆绑
THANKS


13

这些是创建桥接头的步骤。

  1. File-> New-> iOS-> Header File,将桥接文件名命名为“ yourProjectName-Bridging-Header.h”

  2. Build-Settings-> Objective-C桥接头文件,只需给出桥接头文件名即可,例如“ ProjectName-Bridging-Header.h”

    注意:桥接头文件应位于“ .xcodeproj”文件所在的项目的主根文件夹中。如果没有,请将桥接头文件移动到项目的根文件夹。这样Xcode就能访问网桥文件。

  3. 生成项目,然后在“ Bridging”头中导入必要的文件。


12

对我来说,在桥接头文件路径前使用$(SRCROOT)/ $(PROJECT_NAME)/


1
这是一个有效的答案。它不应该被标记下来。您可以使用$(SRCROOT)和$(PROJECT_NAME)作为指南来获得正确的答案,但是您可能无法复制和粘贴所有解决方案。
霍布斯巨虎

这个答案中提出的解决方案实际上已经解决了我的问题,谢谢Srinivas Padidala
Wilson

努力吧。$(SRCROOT)/ $(PROJECT_NAME)/YourProjectName-Bridging-Header.h对我有用……......粘贴$(SRCROOT)/ $(PROJECT_NAME)/ .....不到位的$(PROJECT_NAME)添加您的项目名称
ioSana

6

对我来说,它有助于$(SRCROOT)在我的Objective-C桥接标头路径的前面使用。

$(SRCROOT)/swiftLibraries/swiftLibraries-Bridging-Header.h

5

请按照以下步骤操作:

  1. 删除桥接头文件。。。(也许您是手动创建的);以及
  2. 在Objective-C Project中创建新的Swift文件。。。(不导入,首先创建它)

也许这两件事将帮助您解决问题。


5

以下为我工作:

  1. 桥接头文件应位于“ .xcodeproj”文件所在项目的主根文件夹中。移至项目目录,然后将桥接标题拖放到根目录(如果它在任何其他文件夹中)。
  2. 更正标题名称中的拼写错误。
  3. 清除衍生数据
  4. 目标->构建设置-> Swift编译器:常规->添加对象C头名称。
  5. 清洁并再次运行。

2

手动创建桥接头文件

首先,删除创建Xcode的桥接头文件。并选择项目goto>构建设置>搜索关键字。Swift编译器-代码生成。单击“ Objective-C桥接标题”,删除该路径。现在清理您的项目。

现在,在导航栏中选择项目>窗口。选择项目,然后从那里删除您的派生数据。

现在创建一个新文件,选择Source,然后选择Header File并创建您的Bridging头文件。文件名必须是您的projectname-Bridging-Header.h,然后创建它

选择项目goto>构建设置>搜索关键字。Swift编译器-代码生成。单击“ Objective-C桥接标题”,然后在此“ Objective-C桥接标题”中添加路径,例如projectname-Bridging-Header.h。

现在将您的类导入桥接头文件中,您可以轻松地将其编译为代码。

手动创建文件时,桥接头文件如下所示。


0

帮助我的是手动将文件移动到错误消息中提到的路径。所以:

  1. 我删除了文件(移至垃圾箱)
  2. 将其从废纸to移动到错误消息中的路径
  3. 后来我也不得不清理项目
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.