如何从同一个故事板访问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不是问题。
它确实看起来像Xcode 6.0(6A254o)/ iOS 8 Beta 3中的故事板文件本身的问题。
如果您使用的是Xcode 6以前版本的Storyboard版本,则可以通过强制更新“Identity Inspector”中的“Custom Class”字段来帮助手动更新Interface Builder所抱怨的子类。