gpt4 book ai didi

ios - 带有 nib 文件的 View Controller 是否在 ios 8 beta 5 中损坏?

转载 作者:技术小花猫 更新时间:2023-10-29 10:30:39 24 4
gpt4 key购买 nike

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

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

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.
}

我运行应用程序并按下按钮显示第二个 Controller - 一切正常

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

因为我知道他们弄乱了初始化代码,所以我尝试放入覆盖以查看是否可以修复它:

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.
}

同样的问题。将 required 和 overrides 更改为 xcode 接受的所有可能组合无效。

如果我使用 Storyboard创建另一个 Controller 并继续连接到它,一切都很好。

有什么想法吗?

编辑 - 新信息

  1. 在 init 中尝试过 nibName = nil - 同样的问题
  2. 在 objective-c 中创建了相同的应用程序并且运行良好

显然是一个 swift beta 5 问题

最佳答案

不知道是不是bug,但肯定是改版了。当然,他们可能会改回去……无论如何,种子 5 中的规则是:

View Controller 不会仅仅因为它具有相同的名称就自动找到它的.xib。您必须明确提供名称。

因此,在您的情况下,任何初始化此 View Controller 的尝试最终都必须使用明确的 nib 名称 ("TestVC") 调用 nibName:bundle:,我假设。

如果你希望能够通过调用来初始化

let vc = TestVC()

正如您在呈现 View Controller 中所做的那样,然后只需覆盖呈现 View Controller 中的 init() 即可调用 super.init(nibName:"TestVC", bundle:nil) 这就是您所需要的(除了我认为您还需要 init(coder:) 讨论的 here 塞子)。

编辑 您完全正确,这是一个仅限 Swift 的问题。好眼力。在 Objective-C 中,使用 init(或 new)初始化仍然可以正常工作; View Controller 正确地找到了它的同名 .xib 文件。

另一个编辑 决定因素不是 Objective-C 或 Swift 是否调用 init。这是 View Controller 本身是用 Objective-C 还是 Swift 编写的。

最终编辑 解决方法是像这样声明您的 Swift View Controller :

@objc(ViewController) ViewController : UIViewController { // ...

括号中的名称摆脱了导致问题的名称修改。很可能在下一个版本中会修复此问题,您可以再次删除 @objc

另一个最终编辑 坏消息:我提交的错误报告“按预期工作”回来了。他们指出我所要做的就是在周围的模块之后命名 .xib 文件,例如如果我的应用名为 NibFinder,那么如果我将我的 .xib 文件命名为 NibFinder.ViewController.xib,它将在实例化时自动找到 ViewController()

这很对,但在我看来,它只是重述了错误; Swift 查找过程在模块名称前加上。所以 Apple 说我应该在我的 .xib 文件中添加相同的模块名称,而我是说 Apple 应该在执行搜索时删除模块名称。

编辑为真正的最终版本此错误已在 iOS 9 beta 4 中修复,所有这些解决方法都变得不必要了。

关于ios - 带有 nib 文件的 View Controller 是否在 ios 8 beta 5 中损坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25149604/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com