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

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

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

 Unknown class RoundButton in Interface Builder file. 

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

如果用同名的Swift类replaceObjective-C类,则需要打开Storyboard,编辑自定义类的名称(如删除最后一个字母),保存Storyboard,然后重新命名该类。 这将强制故事板文件升级到更新的版本,新的Xcode正确编写自定义类的键如下:

版本信息差异: 在这里输入图像说明

UIButton自定义类定义diff: 在这里输入图像说明

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

我想添加两个解决scheme为我工作,在两个不同的情况下,我得到了相同的消息( Unknown class MySwiftClass in Interface Builder file. )。

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

 override func initWithNibName:bundle: 

因为这是指定的初始化程序…我已经在做所有的事情了,只是到位了。 然而在运行时,我的课没有看到,直到我删除该方法。

另一种情况下,我有一个不同的Swift UIViewController子类,也没有在运行时find。 最终的解决scheme是重新命名Swift类(我在名称中添加了“2”)。 我改变了故事板上的课程,突然之间就起作用了……这是在试图从故事板中删除名称并重新添加之后,这不起作用。

这两种情况实际上可能是被接受的答案的其他例子 – 但在我的情况下,仅仅改变故事板中的名字是不够的,我不得不以某种方式改变swift类。

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

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

它确实看起来像Xcode 6.0(6A254o)/ iOS 8 Beta 3中的故事板文件本身的问题。

如果您使用的是Xcode 6以前版本的Storyboard版本,则可以通过强制更新“Identity Inspector”中的“Custom Class”字段来帮助手动更新Interface Builder所抱怨的子类。