【发布时间】:2017-02-08 09:06:45
【问题描述】:
iOS 10,不断打破的礼物,似乎改变了另一种行为。
假设两个 UIViewController 被推送到一个 UINavigationController。
在 iOS 8/9 上,调用 navigationController?.popViewController(animated: true) 来弹出顶部 UIViewController(比如 VC2)会导致底部视图控制器(比如 VC1)上的 viewDidLayoutSubviews 被调用。
我们依靠它来刷新 VC1。有时 VC2 会向 VC1 添加子视图(通过数据模型),这需要在弹出回 VC1 时反映出来。
需要准确的帧信息。我们不能使用viewWillAppear,因为frame data is wrong on iOS 9。 viewDidAppear 的问题是在最初看到视图和调整之间存在短暂的故障。
现在 VC1 的 viewDidLayoutSubviews 在弹出 VC2 时不会被调用。
1) 这是viewDidLayoutSubviews 无法被调用的错误吗?
2) 使用 UINavigationController 弹出时刷新视图控制器的正确方法是什么?
【问题讨论】:
-
我假设
viewDidLayoutSubviews在某个时候被调用。是和其他控制器(VC2)一起调用吗? -
@LeoNatan 是的,它在 VC1 第一次出现时被调用
-
实际上听起来是可以接受的行为。如果你更新
viewDidLayoutSubviews中的数据源,那就不好了。 -
@LeoNatan 不,我们不会更新 viewDidLayoutSubviews 中的数据源。 VC2中修改了数据源,但VC1应该反映新数据(这会导致出现新的子视图)。
-
@Crashalot 那么我在回答中的内容是正确的。您应该更新
viewWillAppear中的数据并添加/更新任何新视图。新视图应根据视图控制器当时的视图大小进行设置。viewDidLayoutSubviews可以正常使用来调整子视图的框架。
标签: ios swift uiviewcontroller uinavigationcontroller viewdidlayoutsubviews