为什么不调用 viewDidLoad 函数?

Why viewDidLoad function is not called?

我想在 navigationBar 中更改 UIBarButton 的颜色。为此,我在 viewDidLoad: 中添加了这一行:

navigationController?.navigationBar.tintColor = .white 

一切正常,直到我开始注意到一些奇怪的事情。 UIBarButton 用于关闭 UIViewController。按下时,我只是关闭 viewController。但是,如果我再次显示它 (viewController),UIBarButton 的颜色不是白色,它会得到应用程序的 tintColor

经过一些调试后,我注意到 viewDidLoad:viewController 被关闭并再次显示后不会再次调用。我的UIBarButton颜色不同的原因是因为我在viewDidLoad:中改变了它的颜色。当不调用viewDidLoad:时,颜色当然不会改变。

我发现 iOS 不会为 UIViewController 调用 viewDidLoad:,这对我来说是一个有趣的发现。可能是优化的原因,因为每次都绘制整个 UI 效率不高。

我对这个问题的解决办法是改变颜色,不是在viewDidLoad:,而是在viewDidAppear:。但是,这是解决问题的正确方法吗?为什么在上述情况下没有调用 viewDidLoad:

看起来您创建并存储了视图控制器,但将其包装在 UINavigationController:

let controller = YourModalViewController()
...
func presentMyModal() {
  present(UINavigationController(rootViewController: controller))
}

在这种情况下,您的 viewDidLoad 方法将只被调用一次,您将遇到视觉错误。如果您想将模式的样式代码留在它的文件中,您可以创建实例函数,它将 return 这个控制器包装和样式化。

extension YourModalViewController {
  func wrappedInNC() -> UINavigationController {
    let nc = UINavigationController(rootViewController: controller)
    // Styling code.
    return nc
  }
}