【问题标题】:Why doesn’t my second override of viewDidLoad get called?为什么我对 viewDidLoad 的第二次覆盖没有被调用?
【发布时间】:2020-12-16 01:56:32
【问题描述】:

我两次覆盖 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 没有被调用,因为你的“视图”是零。您必须以任何这些方式初始化您的视图控制器。 1. 从 xib 加载 2. 从情节提要加载 3. 以编程方式创建一个视图控制器,该控制器具有指定框架的视图

标签: ios swift uiviewcontroller viewdidload


【解决方案1】:

请注意ViewDidLoad是一个生命周期函数,它不会被编程触发,只有在

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

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

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

【讨论】:

  • 也不正确。你会看到两个打印语句...被 myDel 调用是 nil 因为只有一个覆盖被调用
  • 我不明白答案。也许您可以提供更多关于您为什么认为它有效的解释?此外,名为 _ 的变量非常令人困惑,可以用描述性名称替换它吗?
  • 你不需要使用它,你只是调用它来触发加载,苹果文档说视图加载在 vc 视图加载后调用,所以平静它会将它加载到内存中,试一试调用变量然后调试你的视图控制器
猜你喜欢
  • 2015-12-24
  • 1970-01-01
  • 2017-06-19
  • 2017-06-28
  • 2020-05-12
  • 2011-05-06
  • 1970-01-01
  • 1970-01-01
  • 2019-07-24
相关资源
最近更新 更多