我已经阅读了使用XCode故事板来实例化使用XIB进行设计的视图控制器,但是在Swift中使用XCode进行工作时遇到了麻烦(使用Xcode 6 Beta 6)。我想知道我做错了什么还是该功能不再可用?
我创建了一个简单的存储库https://github.com/jer-k/StoryboardTesting- Swift,展示了上述方法。
我设法通过在init中添加和覆盖来解决此问题
required init(coder aDecoder: NSCoder) { super.init(nibName: "TestViewController", bundle: NSBundle.mainBundle()) }
但我想知道是否还有情节提要板可以替我处理。创建一个超类以使我的所有UIViewControllers从上面的代码继承都不是世界上最麻烦的事情,但是我对此很好奇。
发生的是,种子5打破了一种机制,即如果视图控制器是Swift类,则视图控制器可以按名称查找其xib。原因是,在Swift的思想中,类的名称与您给它的名称(以及您给xib文件的名称)不同。该名称已被“篡改”,特别是通过在模块名称前添加前缀(即,Swift类具有命名空间)。
我提供了三种解决方法:
您的解决方法很不错(按名称显式加载.xib文件)
将.xib文件命名为 MyModule.TestViewController.xib ,其中MyModule包的名称(即项目名称)在哪里(这是Apple的建议,但我讨厌它)
MyModule
@objc(TestViewController)在视图控制器的class声明之前使用以克服名称混乱的问题,这是打破机制的原因(这是我赞成的方法)
@objc(TestViewController)
class
编辑 此错误已在iOS 9 beta 4中修复。如果nib文件搜索失败,iOS 9现在会从视图控制器类名称中剥离模块名称,并再次执行nib文件搜索。