为什么第二次覆盖viewDidLoad不会被调用?

问题描述

我重写viewDidLoad两次。第二次,所以我可以设置一个委托。但是...没有被调用,因为myDel为零。为什么在具体类CoolTableController中没有调用我的重写?

protocol CoolTableProtocol {
   //unrelevant code
}

class CoolTableViewController: UITableViewController {
    var myDel: CoolProtocol!
    override func viewDidLoad() {
        super.viewDidLoad()
        print("myDel")
        //this should not be nil....yet it is
        print(myDel)
    }
}

class CoolTableController: CoolTableViewController,CoolTableProtocol {
    override func viewDidLoad() {
        self.myDel = self
        super.viewDidLoad()
    }
}

我所说的是:

let coolTableVC = CoolTableController()
mainView.addSubview(coolTableVC.view)
self.addChild(coolTableVC)
coolTableVC.didMove(toParent: self)
        

解决方法

请注意,ViewDidLoad是生命周期函数,不会以编程方式触发,而只会在以下情况下触发

  • viewDidLoad在控制器的视图加载到内存后调用。

创建UIViewController的普通实例不会自行触发这些功能。

因此您可以像coolTableVC.view这样调用let _ = coolTableVC.view,因为该函数将在加载.view之后触发。