3

iOS 10,不断打破的礼物,似乎改变了另一种行为。

假设两个 UIViewController 被推送到一个 UINavigationController 上。

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

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

需要准确的帧信息。我们无法使用viewWillAppear,因为iOS 9 上的帧数据错误。问题viewDidAppear是在最初看到视图和调整之间存在短暂的故障。

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

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

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

4

2 回答 2

3

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

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

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

于 2016-09-29T21:44:28.550 回答
2

我将补充 rmaddy 的回答。您需要将执行布局和更新数据分离。如果您的流程需要在视图即将出现时更新数据,您应该在 中更新控制器的视图支持数据viewWillAppear:,重新加载您的视图,然后使用 将视图标记为需要布局setNeedsLayout。这将导致系统在控制器的视图上执行布局,并触发布局。这样,您可以确保在视图准备好后执行布局,而不是之前(通常在viewWillAppear:.

于 2016-09-29T21:58:25.230 回答