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