UINavigationController 在一个视图上调用 willMoveToWindow 和 didMoveToWindow 两次,在显示动画的情况下

Posted

技术标签:

【中文标题】UINavigationController 在一个视图上调用 willMoveToWindow 和 didMoveToWindow 两次,在显示动画的情况下【英文标题】:UINavigationController calls willMoveToWindow and didMoveToWindow twice on a view, in the case of show animation 【发布时间】:2017-04-09 12:57:03 【问题描述】:

我希望能够检查一个视图(我们称他为 myView)何时打开/关闭屏幕。

我可以通过检查 myView 上是否调用 willMoveToWindow 和 didMoveToWindow 来做到这一点。

我的问题始于带有动画的 UINavaigationController:

假设我们有两个屏幕: 屏幕 A 带有一个按钮,该按钮将导致带有后退按钮的 Show segue 作为导航控件。

问题是: 一旦点击按钮,屏幕 A 的视图就会被调用两次:

第一次使用真实窗口调用 viewWillMoveToWindow。 然后,在下一个循环中,使用 nil 窗口调用视图。

在这两个调用之间,我得到了一个非法状态,我认为视图即将呈现,尽管他很快就会被删除..

我尝试通过在导航控制器上使用 _transitionAnimationContext 来解决此问题,并查看谁是 fromViewController。如果是我的 VC,我会忽略这个电话,因为我即将被删除。 这种方法的问题是使用了私有 API,我试图避免这种情况。

有什么想法吗??

【问题讨论】:

【参考方案1】:

所以,我会回答我自己的问题:)

经过一番搜索,我发现了如下 UIViewController 扩展:

@interface UIViewController(UIViewControllerTransitionCoordinator)
@property(nonatomic, readonly, nullable) id <UIViewControllerTransitionCoordinator> transitionCoordinator NS_AVAILABLE_ios(7_0);

在 UIViewControllerTransitionCoordinator.h 中

此属性保存当前的转换协调器,您可以从该协调器到达 fromViewController,在这种情况下,它将指示视图 willMoveToWindow 用于转换而不是用于呈现。

享受吧!

【讨论】:

以上是关于UINavigationController 在一个视图上调用 willMoveToWindow 和 didMoveToWindow 两次,在显示动画的情况下的主要内容,如果未能解决你的问题,请参考以下文章

关闭 UINavigationController 并呈现另一个 UINavigationController

iOS:如何在现有 UINavigationController 中打开另一个 UINavigationController?

带有主 UINavigationController 和详细 UINavigationController 的 UISplitViewcontroller

带有 UINavigationController 的 UITabBarController,在 hidesBottomBarWhenPushed 上隐藏 UINavigationController

在 UINavigationController 内的 UITabBarcontroller 中添加 UINavigationController?

UINavigationController 与 AppDelegate 中的 UISegmentedControl 切换 UINavigationController 的 rootviewcontr