我无法判断这是否是一个错误,但它肯定是一个变化。当然他们可能会把它改回来……无论如何,种子 5 中的规则是:
视图控制器将not仅仅因为它具有相同的名称,就会自动找到它的 .xib。您必须明确提供名称。
因此,在您的情况下,任何初始化此视图控制器的尝试最终都必须调用nibName:bundle:
具有明确的笔尖名称("TestVC"
), 我假设。
如果您希望能够通过调用来初始化
let vc = TestVC()
正如您在呈现视图控制器中所做的那样,然后只需覆盖init()
在呈现的视图控制器中调用super.init(nibName:"TestVC", bundle:nil)
这就是你所需要的(除了我认为你还需要init(coder:)
塞子讨论here https://stackoverflow.com/questions/25126295/swift-class-does-not-implement-its-superclasss-required-members).
EDIT你说得对,这是一个 Swift 独有的问题。发现得好。在 Objective-C 中,初始化为init
(or new
)仍然工作正常;视图控制器正确找到其同名 .xib 文件。
另一个编辑决定因素不是 Objective-C 还是 Swift 调用init
。是是否视图控制器本身是用 Objective-C 或 Swift 编写的。
最终编辑解决方法是像这样声明 Swift 视图控制器:
@objc(ViewController) ViewController : UIViewController { // ...
括号中的名称消除了导致问题的名称损坏。很可能在下一个版本中这个问题将被修复,您可以采取@objc
再次离开。
另一个最终编辑坏消息:我就此提交的错误报告“按预期工作”。他们指出我所要做的就是命名.xib周围模块之后的文件,例如如果我的应用程序被调用尼克查找器,那么如果我命名我的.xib file NibFinder.ViewController.xib,实例化时会自动找到ViewController()
.
这确实是事实,但在我看来,这只是重申了这个错误; Swift 查找过程在模块名称前面添加。所以苹果说我应该努力并在我的模块前面添加相同的模块名称.xib文件,而我是说苹果应该在执行搜索时努力并去掉模块名称。
真正最终的编辑这个错误在 iOS 9 beta 4 中得到了修复,所有这些解决方法都变得不必要了。