一尘不染

无法在Swift中的Storyboard中加载UIViewController XIB文件

swift

我已经阅读了使用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从上面的代码继承都不是世界上最麻烦的事情,但是我对此很好奇。


阅读 372

收藏
2020-07-07

共1个答案

一尘不染

发生的是,种子5打破了一种机制,即如果视图控制器是Swift类,则视图控制器可以按名称查找其xib。原因是,在Swift的思想中,类的名称与您给它的名称(以及您给xib文件的名称)不同。该名称已被“篡改”,特别是通过在模块名称前添加前缀(即,Swift类具有命名空间)。

我提供了三种解决方法:

  • 您的解决方法很不错(按名称显式加载.xib文件)

  • 将.xib文件命名为 MyModule.TestViewController.xib ,其中MyModule包的名称(即项目名称)在哪里(这是Apple的建议,但我讨厌它)

  • @objc(TestViewController)在视图控制器的class声明之前使用以克服名称混乱的问题,这是打破机制的原因(这是我赞成的方法)

编辑 此错误已在iOS 9 beta 4中修复。如果nib文件搜索失败,iOS 9现在会从视图控制器类名称中剥离模块名称,并再次执行nib文件搜索。

2020-07-07