如何从同一个故事板访问 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 中的导航栏没有出现