使用UINavigationController弹出顶视图时不再调用viewDidLayoutSubviews

时间:2016-09-29 21:40:41

标签: ios swift uiviewcontroller uinavigationcontroller viewdidlayoutsubviews

iOS 10,一直在打破的礼物,似乎已经改变了另一种行为。

假设将两个UIViewControllers推送到UINavigationController。

在iOS 8/9上,调用navigationController?.popViewController(animated: true)弹出顶部UIViewController(比如VC2)导致底部视图控制器(比如VC1)上的viewDidLayoutSubviews被调用。

我们依靠这个来刷新VC1。有时VC2会将子视图添加到VC1(通过数据模型),这需要在弹回VC1时反映出来。

需要准确的帧信息。我们无法使用viewWillAppear,因为frame data is wrong on iOS 9viewDidAppear的问题在于最初看到视图和调整之间存在短暂的故障。

现在弹出VC2时不会调用VC1的viewDidLayoutSubviews

1)这是不能调用viewDidLayoutSubviews的错误吗?

2)在使用UINavigationController弹出时刷新视图控制器的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

依赖viewDidLayoutSubviews从来都不是正确的解决方案。 UIViewController提供viewWillAppear:viewDidAppear:用于此类用途。当从导航控制器弹出VC2时,将在VC1上调用这两个方法,以告知您将再次显示或现在可见。

viewDidLayoutSubviews只应用于调整视图框架和布局。

viewWill|DidAppear:应该用于处理视图控制器最初或再次可见。在您的情况下,您应该使用它来更新数据并根据需要添加/更新视图。应根据视图控制器的当前帧设置这些新视图。它们将根据您的需要在viewDidLayoutSubviews的实施中进行调整。

答案 1 :(得分:1)

我将补充rmaddy的回答。您需要解耦执行布局和更新数据。如果您的流程是在视图即将出现时更新数据,则应更新viewWillAppear:中控制器的视图支持数据,重新加载视图,然后使用{将视图标记为需要布局{1}}。这将导致系统在控制器的视图上执行布局,并将触发布局。通过这种方式,您可以确保在视图准备就绪后执行布局,而不是之前(通常情况属于setNeedsLayout