使用过渡委托时触发 viewWillAppear
Posted
技术标签:
【中文标题】使用过渡委托时触发 viewWillAppear【英文标题】:Trigger viewWillAppear when using a transitioning delegate 【发布时间】:2016-07-20 14:08:53 【问题描述】:我想展示一个视图控制器:
模态 使用自定义过渡 同时,我想确保当它被解除时,它背后的视图控制器知道被推到前台。我的基本想法是尝试一些不同的配置,看看哪一个会导致 viewWillAppear
在后面的视图控制器上被调用。
尝试 1
presentedViewController.modalPresentationStyle = .Custom
presentedViewController.transitioningDelegate = someTransitioningDelegate
这种方法的结果:
自定义过渡效果非常好 当我调用presentedViewController.dismissViewControllerAnimated(true)
时,viewWillAppear
not 不会在 presentedViewController
后面的视图控制器上被调用
我确实希望 viewWillAppear
在被关闭的视图控制器下方被调用,所以我这样做了:
尝试 2
presentedViewController.modalPresentationStyle = .FullScreen
presentedViewController.transitioningDelegate = someTransitioningDelegate
或
presentedViewController.modalPresentationStyle = .FullScreen
presentedViewController.modalTransitionStyle = .CoverVertical
presentedViewController.transitioningDelegate = someTransitioningDelegate
这种方法的结果:
viewWillAppear
在关闭 presentedViewController
时在 presentedViewController
后面的视图控制器上被调用
当呈现视图控制器时,转换按预期发生。
关闭视图控制器时,过渡期间的背景为黑色,这是不希望的。
似乎.FullScreen
导致presentedViewController
后面的视图控制器从显示层次结构中移除——这很好,因为大概这就是触发viewWillAppear
调用的原因。
尝试 3
presentedViewController.modalPresentationStyle = .FullScreen
presentedViewController.modalTransitionStyle = .CoverVertical
这样的结果是:
viewWillAppear
在 presentedViewController
后面的视图控制器上被调用。
过渡期间的背景是位于presentedViewController
后面的视图控制器,这是理想的。
没有自定义过渡。
我正在从事的项目的结构使得使用委托变得困难(这似乎是建议的答案here)。使用NSNotificationCenter
是另一种选择,它可以让我调用应该由viewWillAppear
调用的代码,但是从尝试3 开始,我希望有一种更优雅的方法来实现所有这些:
-
触发
viewWillAppear
使用自定义过渡
在过渡动画期间查看在后台呈现的视图控制器
【问题讨论】:
【参考方案1】:似乎 Apple 认为调用 viewWillAppear
等是犯规,但调用 beginAppearanceTransition
和 endAppearanceTransition
、which in turn will invoke viewWillAppear
是可以的。这个我会去的。
【讨论】:
【参考方案2】:我过去实现这一点的方法是从过渡动画师调用 viewWillAppear 和 viewDidAppear。这是一个简化的示例:
public func animateTransition(transitionContext: UIViewControllerContextTransitioning)
let fromVC = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey)
let toVC = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)
fromVC.viewWillDisappear(true)
toVC.viewWillAppear(true)
UIView.animateWithDuration(0.3, animations:
//Animations here
, completion: (success) in
toVC.viewDidAppear(success)
fromVC.viewDidDisappear(success)
transitionContext.completeTransition(true)
)
我在做动画之前调用“will”方法,在完成之后调用“did”方法
【讨论】:
以上是关于使用过渡委托时触发 viewWillAppear的主要内容,如果未能解决你的问题,请参考以下文章
当我添加 NSPredicate 时,为啥我的 NSFetchedResultsController 委托停止触发?