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

标签 swift uiviewcontroller uinavigationcontroller

我试图理解使用初始化程序初始化 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/

相关文章:

swift - 解析关系/合并表 <Swift>

Swift 3 中的 JSON 解析错误

ios - 为什么我的 Xcode 界面生成器显示红色 block 并且无法呈现

ios - [self.navigationController popToViewController :VC2 animated:NO]; crash

ios - 尝试用 ViewController 做一个简单的分数虽然难倒

ios - 如何从 Flutter 平台启动 ViewController 特定于 Swift 编写的代码?

ios - 在ios中点击后退按钮后调用什么方法

ios - 使用 SDWebImage 和 FirebaseStorageUI 删除缓存 URL

ios - NSFetchedResultsController:在后台线程中获取

ios - 如何在用户操作后添加标签栏