Ios 为什么不调用viewDidLoad函数?

Ios 为什么不调用viewDidLoad函数?,ios,uibarbuttonitem,Ios,Uibarbuttonitem,我想更改导航栏中的UIBarButton的颜色。为了实现这一点,我在viewdiload:中放了以下几行: navigationController?.navigationBar.tintColor = .white 一切正常,直到我开始注意到一些奇怪的事情。该UIBarButton用于关闭UIViewController。按下它时,我只需关闭viewController。但是,如果我再次显示它(viewController),则UIBarButton的颜色不是白色,而是应用程序的tintC

我想更改
导航栏中的
UIBarButton
的颜色。为了实现这一点,我在
viewdiload:
中放了以下几行:

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

在进行了一些调试之后,我注意到,
viewdiload:
在刚刚解除并再次显示
viewController
之后,不会再次调用
viewdiload:
。我的
UIBarButton
具有不同颜色的原因是我在
viewDidLoad:
中更改了它的颜色。当不调用
viewDidLoad:
时,当然,颜色不会改变

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


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

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

let controller=YourModalViewController()
...
func presentMyModal(){
存在(UINavigationController(rootViewController:controller))
}
在这种情况下,您的
viewdiload
方法只会被调用一次,您将出现视觉错误。如果您想将模态的样式代码保留在其文件中,您可以创建实例func,该实例func将返回该控制器的包装和样式

扩展您的ModalViewController{
func wrappedInNC()->UINavigationController{
设nc=UINavigationController(rootViewController:controller)
//样式代码。
返回nc
}
}

viewDidLoad:
对任何控制器的实例调用一次。因此,您可能已经全局声明了该控制器,而不是每次都在演示时。因此,基本上你没有发现任何有趣的东西,只是误解了行为。对于你在
viewdide中的第二个查询:
这是正确的方法吗?这不会对应用程序的性能产生任何影响,因为你只是在设置颜色。但是需要一些时间才能反映颜色,因为
viewdide:
在显示视图后调用。另外,请保留与您的问题相关的问题标题。这是不同的。你是对的,我存储视图控制器并将其包装在UINavigationController中。您的意思是,如果viewDidLoad被包装在NC中,那么它只调用一次?如果不是,它会被调用吗?@neo viewDidLoad每个控制器实例只调用一次。这是设计上的。根据iOS指南,视图控制器在加载时只调用一次视图didload。稍后,如果不完全重新加载视图控制器,则只显示调用的视图。因此,上面提供的任何代码都可以解决这个问题