2

我正在尝试从 Swift 调用 Objective-C 代码。我创建了一个 Swift Bridging Header,并将导入添加到 Objective-C 文件(例如#import "UIColor+Utils.h")。

项目构建,我什至得到了代码完成,但是当它尝试执行那行代码时,它崩溃并说unrecognized selector sent to class.

我做错了什么?

(Xcode 6.2,iOS 8.2)

4

2 回答 2

12

这是当您尝试从包含在桥接头中但未添加到正确目标的文件中调用扩展方法时引起的。

要解决此问题,请确保该文件与当前正在运行的文件属于同一目标

例如,如果您尝试UIColor+Utils.m从 WatchKit 扩展调用 Objective-C 代码(例如 ),那么 .m 文件(例如UIColor+Utils.m)必须在其目标成员部分中包含 WatchKit 扩展。

有关更多信息,请参见下文。


如果您在文件中包含 .h 文件Bridging-Header.h,但忘记将文件添加到目标,您将得到以下行为。

如果您尝试在自己的类上调用方法(例如ABCClass.doSomething()):

  • 您将获得代码完成。
  • 你会得到一个构建错误:Undefined symbols for architecture x86_64.

如果您尝试调用类扩展方法(例如UIColor.doSomething()):

  • 您将获得代码完成。
  • 您不会收到任何构建错误/警告。
  • 尝试执行该行时,您将遇到崩溃:unrecognized selector sent to class
于 2015-04-03T18:19:25.073 回答
0

使用 xCode 8,当您添加文件时,请确保从“选项”中选择正确的目标。我正在选择一个文件夹并将其直接添加到我的项目中,但不知何故没有设置正确的目标。

在此处输入图像描述

于 2017-06-30T19:06:28.330 回答