我试图理解使用初始化程序初始化 UINavigationController
背后的逻辑:
UINavigationController(rootViewController: MyViewController())
我正在修改的应用程序使用了这个初始化器和 MyViewController
我拥有的自定义初始化器:
class MyViewController:UIViewController{
init(){
super.init(nibName: "MyViewController", bundle: nil)
}
}
在 MyViewController
生命周期方法中,viewDidLoad
过去的 navigationController
值不是nil
。
我所做的唯一更改是在自定义初始化程序中。现在:
init(){
super.init(nibName: nil, bundle: nil)
/*EDIT*/
let dummyMe = UIView()
view.addSubview(dummyMe)
}
换句话说,我不想使用 xib 文件。这一更改让我陷入崩溃,经过一些调试,我意识到 navigationController
值在 viewDidLoad
方法中为 nil,但在我的 viewWillAppear 方法中却没有。
这怎么可能? UINavigationController
初始化程序是否应该调用 viewDidLoad
?为什么 navigationController
现在的值为 nil
?
谢谢
最佳答案
你应该检查你的代码。示例按预期工作,您可以将其粘贴到 Playground 上:
import UIKit
import PlaygroundSupport
class MyViewController:UIViewController{
override func viewDidLoad() {
super.viewDidLoad()
print(#function)
print(navigationController)
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
print(#function)
print(navigationController)
}
}
let controller = UINavigationController(rootViewController: MyViewController())
此代码不会触发生命周期方法。添加PlaygroundPage.current.liveView = controller.view
触发并查看:
viewDidLoad()
Optional(<UINavigationController: 0x7ffb18001200>)
viewWillAppear
Optional(<UINavigationController: 0x7ffb18001200>)
更新:
添加自定义 View 覆盖loadView
:
override func loadView() {
super.loadView()
let subviewFrame = view.bounds
let dummyMe = UIView(frame: subviewFrame)
dummyMe.autoresizingMask = [.flexibleHeight, .flexibleWidth]
dummyMe.backgroundColor = .yellow
view.addSubview(dummyMe)
}
甚至:
override func loadView() {
let dummyMe = UIView()
dummyMe.backgroundColor = .yellow
view = dummyMe
}
关于swift - UINavigationController(rootViewController : MyViewController()) triggers viewdidLoad and returns nil navigationController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56650594/