我在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接受的所有可能组合无效.
如果我使用故事板创建另一个控制器并且它已经完成了,那么一切都很顺利.
有任何想法吗?
编辑 - 新信息
显然是一个快速的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中得到修复,所有这些变通办法都变得不必要了.
归档时间: |
|
查看次数: |
6536 次 |
最近记录: |