如何从同一个故事板访问 Objective-C 和 Swift 类?

Posted

技术标签:

【中文标题】如何从同一个故事板访问 Objective-C 和 Swift 类?【英文标题】:How to access both Objective-C and Swift classes from same storyboard? 【发布时间】:2014-06-03 16:45:13 【问题描述】:

我已经在 Swift 中实现了一个 UIButton 派生类(RoundButton),其余的仍在 Objective-C 中。如何在同一个 Storyboard 中同时访问基于 Objective-C 的类和基于 Swift 的类?

您可以在 Storyboard 的 UIButton Custom Class - Class 字段中键入 RoundButton,但 ios 会提供以下警告运行时:

Unknown class RoundButton in Interface Builder file.

【问题讨论】:

【参考方案1】:

Xcode 6.0 (6A215l) 似乎需要将 Storyboard 文件升级到更新版本才能访问 Swift 类。

如果您将 Objective-C 类替换为同名的 Swift 类,则需要打开 Storyboard,编辑自定义类的名称(如删除最后一个字母),保存 Storyboard,然后重命名该类背部。这将强制 Storyboard 文件升级到更新的版本,并且新的 Xcode 正确地编写自定义类键,如下所示:

版本信息差异:

UIButton 自定义类定义差异:

在 Storyboard 文件中进行这些更改后,警告似乎消失了,并且使用了正确的自定义类。

【讨论】:

我想补充一点,我遇到了同样的问题。重命名课程也解决了这个问题。在我的例子中,我用 Swift 重写了一个有效的 Objective-C 类。这个类被称为BTZGenres.m。我创建的新类名为 Genres.swift(注意我删除了“BTZ”)。在 Storyboard 场景中,我更改了 UIViewController 类以使用新的基于 swift 的类。我还指出我使用的是更新版本的 Xcode (6.1.1)。如果这是 Xcode 错误,那么它在 6.1.1 中还没有修复。这个项目最初是在 Xcode 5 中构建的。 这似乎是 Xcode 中的一个错误。重命名对于情节提要重新加载类至关重要。请注意,故事板中的 Swift 类具有额外的模块信息。在您的情况下,您在项目的目标中定义了一个名为“fantter”的模块。【参考方案2】:

我想添加另外两个对我有用的解决方案,在两个不同的情况下,我收到了相同的消息 (Unknown class MySwiftClass in Interface Builder file.)

在第一种情况下,我有一个 UIViewController 的 Swift 子类。好吧,我以为我想在 init 中设置一些东西,所以我实现了:

override func initWithNibName:bundle:

因为那是指定的初始化器...我在方法中做任何事情,它就在适当的位置。然而在运行时,直到我删除了该方法,我的类才被看到。

在另一种情况下,我有一个不同的 Swift UIViewController 子类,在运行时也没有找到。最终解决方法是重命名 Swift 类(我在名称中添加了“2”)。我也在情节提要中更改了课程,突然它起作用了……这是在尝试从情节提要中删除名称并重新添加之后,但没有用。

这两种情况可能确实是已接受答案的其他示例 - 但在我的情况下,仅更改情节提要中的名称是不够的,我必须以某种方式更改 swift 类本身。

【讨论】:

【参考方案3】:

你应该确保你已经添加了 Objective C 桥接头。在同一个故事板中同时使用 Objective C 和 Swift 不是问题。

http://i58.tinypic.com/33aqbyu.png

【讨论】:

【参考方案4】:

Xcode 6.0 (6A254o) / iOS 8 Beta 3 中的 Storyboard 文件本身似乎确实存在问题。

如果您使用的是 Xcode 6 之前的 Storyboard 版本,只需通过强制更新“身份检查器”中的“自定义类”字段来手动更新 Interface Builder 抱怨的子类可能会有所帮助。

【讨论】:

以上是关于如何从同一个故事板访问 Objective-C 和 Swift 类?的主要内容,如果未能解决你的问题,请参考以下文章

Objective-c 故事板 - UITableViewController 中的导航栏没有出现

使用两个继承类创建故事板屏幕

混合objective-c/swift项目中的故事板颜色问题

从代码进行故事板 UI 测试

如何将故事板连接到代码

如何知道 xamarin iOS 中当前的故事板名称?