UINavigationController(rootViewController: MyViewController()) 触发 viewdidLoad 和 returns nil navigationController

UINavigationController(rootViewController: MyViewController()) triggers viewdidLoad and returns nil navigationController

我试图理解使用初始化器初始化 UINavigationController 背后的逻辑:

UINavigationController(rootViewController: MyViewController())

我正在修改的应用程序使用了这个初始化程序和我拥有的 MyViewController 自定义初始化程序:

class MyViewController:UIViewController{

    init(){
        super.init(nibName: "MyViewController", bundle: nil)
    }

}

MyViewController 生命周期方法中,viewDidLoad 过去没有 nil 作为 navigationController 值。

我所做的唯一更改是在自定义初始化程序中。现在:

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>)

更新:

添加自定义视图覆盖 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
}