在ios 8 beta 5中是否损坏了带有nib文件的视图控制器?

Jim*_*m T 12 xcode ios

我在ios 8 beta 4中创建了一个测试项目,它作为主视图控制器和第二个视图控制器创建为带有xib文件的UIViewController子类.

我在主控制器上放了一个按钮来显示第二个控制器:

class ViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}

@IBAction func testVCBtnTapped() {
    let vc = TestVC()
    presentViewController(vc, animated: true, completion: nil)
}
override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}
Run Code Online (Sandbox Code Playgroud)

}

我运行应用程序并按下按钮显示第二个控制器 - 一切都很好

转到xcode beta 5,我运行应用程序,当我按下按钮时,屏幕变黑.

因为我知道他们搞砸了init代码,所以我尝试使用覆盖来查看它会修复它:

class TestVC: UIViewController {

override init() {
    super.init()
}
required init(coder aDecoder: NSCoder!) {
    super.init(coder: aDecoder)
}
override init(nibName nibNameOrNil: String!, bundle nibBundleOrNil: NSBundle!) {
    super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
}
Run Code Online (Sandbox Code Playgroud)

同样的问题.将所需和覆盖更改为xcode接受的所有可能组合无效.

如果我使用故事板创建另一个控制器并且它已经完成了,那么一切都很顺利.

有任何想法吗?

编辑 - 新信息

  1. 在init中尝试了nibName = nil - 同样的问题
  2. 在目标c中创建了相同的应用程序,它工作正常

显然是一个快速的beta 5问题

mat*_*att 25

我不知道这是不是一个错误,但它肯定是一个变化.当然,他们可能会改变它......无论如何,种子5中的规则是:

视图控制器不会仅因为它具有相同的名称自动查找其.xib.您必须明确提供名称.

因此,在您的情况下,任何初始化此视图控制器的尝试都必须最终nibName:bundle:使用显式的nib名称("TestVC")调用,我假设.

如果您希望能够通过调用进行初始化

let vc = TestVC()
Run Code Online (Sandbox Code Playgroud)

正如您在呈现视图控制器中所做的那样,然后只需init()在显示的视图控制器中覆盖即可调用super.init(nibName:"TestVC", bundle:nil),这就是您所需要的(除了我认为您还需要此处init(coder:)讨论的限制器).

编辑你是完全正确的,这是一个仅限Swift的问题.好眼力.在Objective-C中,用init(或new)初始化仍然可以正常工作; 视图控制器正确找到其同名的.xib文件.

另一个编辑决定因素不是Objective-C或Swift调用init.它是否是视图控制器本身被写入在Objective-C或夫特.

最终编辑解决方法是声明你的Swift视图控制器如下:

@objc(ViewController) ViewController : UIViewController { // ...
Run Code Online (Sandbox Code Playgroud)

括号中的名称消除了导致问题的名称错误.很可能在下一个版本中,这将被修复,你可以@objc再次离开.

另一个最终编辑坏消息:我提交的错误报告回来了"按预期工作".他们指出,所有我需要做的就是命名的.xib周边模块后的文件,例如,如果我的应用程序被称为NibFinder,那么如果我的名字我的.xib文件NibFinder.ViewController.xib,它会自动实例化时发现ViewController().

这是真的,但在我看来,它只是重述了这个错误; Swift查找过程在模块名称前面加上.因此,苹果公司表示我应该为我的.xib文件提供相同的模块名称,而我说苹果公司应该支持并在执行搜索时删除模块名称.

编辑真的很棒这个错误在iOS 9 beta 4中得到修复,所有这些变通办法都变得不必要了.