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

The*_*Jer 23 storyboard xib uiviewcontroller ios swift

我已经阅读了使用XCode故事板来实例化使用XIB进行设计的视图控制器,但是我在使用Swift(使用Xcode 6 Beta 6)时遇到了麻烦.我想知道我做错了什么或者这个功能不再可用了吗?

我创建了一个简单的存储库,https://github.com/jer-k/StoryboardTesting-Swift,它展示了上述方法.

我设法通过添加和覆盖init来解决问题

required init(coder aDecoder: NSCoder) {
    super.init(nibName: "TestViewController", bundle: NSBundle.mainBundle())
}
Run Code Online (Sandbox Code Playgroud)

但我想知道是否仍有可能让故事板为我处理这个问题.创建一个超类让我的所有UIViewControllers继承上面的代码并不是世界上最麻烦的东西,但我只是好奇.

mat*_*att 40

发生了什么事情,如果视图控制器是一个Swift类,种子5破坏了视图控制器可以通过名称找到其xib的机制.原因是,在Swift的脑海中,类的名称与您给它的名称(以及您给出的xib文件的名称)不同; 该名称已被"修改",特别是通过预先添加模块名称(即Swift类具有命名空间).

我提供了三种解决方法:

  • 您的解决方法很好(明确地按名称加载.xib文件)

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

  • @objc(TestViewController)在视图控制器的class声明之前使用,以克服名称错误,这是破坏机制(这是我赞成的方法)

请参阅我在此处的讨论:https://stackoverflow.com/a/25163757/341994以及我从那里链接的进一步讨论:https://stackoverflow.com/a/25152545/341994

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


归档时间:

查看次数:

12058 次

最近记录:

9 年,3 月 前