返回细节视图控制器时,主视图未更新?

Posted

技术标签:

【中文标题】返回细节视图控制器时,主视图未更新?【英文标题】:When going back in details viewcontroller, main view is not updated? 【发布时间】:2018-05-22 17:49:03 【问题描述】:

在我的详细信息控制器中,我单击它并返回到主控制器。

 @IBAction func backButtonClick(_ sender: UIButton) 
        dismiss(animated: true, completion: nil)
    

为什么主函数viewDidLoad没有再次命中?

viewDidLoad()

返回时如何更新主视图?

【问题讨论】:

因为视图不会再次加载,它只会加载一次。 【参考方案1】:

你需要实现viewDidAppear,因为viewDidLoad在VC启动时只触发一次

override func viewDidAppear(_animated:Bool) 
  super.viewDidAppear(animated)

【讨论】:

谢谢,这正是我想要的。 我不会说答案完全无效,但请记住,在某些时候,您可能会在显示视图后调用viewDidAppear 时遇到相当简单的延迟... 【参考方案2】:

为什么主函数viewDidLoad没有再次命中?

因为viewDidLoad() 方法在视图控制器的视图已加载时调用,即当视图控制器的视图有新分配到内存中时会调用它。因此,viewDidLoad 在返回(从当前视图控制器关闭/弹出)到视图控制器时不会再次被调用,因为它已经加载,它仍在内存中。

返回时如何更新主视图?

好吧,实际上viewDidLoad 并不是视图控制器视图生命周期的唯一方法,当然还有其他选项可以实现您所寻找的。合法有效的解决方案之一是将“返回”时应调用的代码从 viewDidLoad 移动到 viewWillAppear(_:) 方法中:

override func viewWillAppear(_ animated: Bool) 
    super.viewWillAppear(animated)

    // here we go...

它在显示视图控制器的视图之前被调用,这意味着即使在两种情况下它都会被调用:当呈现/推送到视图控制器时和甚至在关闭/弹出之后。

此外:

不过viewWillAppear(_:) 不仅可以解决您的问题,“返回”视图控制器时还会调用其他方法,我建议您检查一下:

Looking to understand the ios UIViewController lifecycle

还有:

UIViewController viewDidLoad vs. viewWillAppear: What is the proper division of labor?

【讨论】:

以上是关于返回细节视图控制器时,主视图未更新?的主要内容,如果未能解决你的问题,请参考以下文章

UINavigationBar titleTextAttributes 从视图控制器返回后未更新

弹出视图控制器时 UIAppearance 未更新

呈现视图控制器中的方向更改未更新父视图控制器

为啥当我返回时我的主视图控制器不会更新?

在表格视图单元格中使用步进器 - 但返回 VC 的数据未正确更新

导航控制器子视图的属性未更新