我想呈现一个视图控制器:
我的基本想法是尝试一些不同的配置,看看哪一个会导致在后面的视图控制器上调用viewWillAppear
。
尝试1
presentedViewController.modalPresentationStyle = .Custom
presentedViewController.transitioningDelegate = someTransitioningDelegate
这种方法的结果:
viewWillAppear
时,presentedViewController
会在presentedViewController.dismissViewControllerAnimated(true)
后面的视图控制器上调用 我确实希望在被解雇的视图控制器上调用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
答案 0 :(得分:4)
似乎Apple认为调用viewWillAppear
等是犯规行为,但可以调用beginAppearanceTransition
和endAppearanceTransition
,which in turn will invoke viewWillAppear
。我要和你一起去。
答案 1 :(得分:-1)
我过去实现这一目标的方法是从过渡动画师调用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)
})
}
我打电话给"将"我做动画之前的方法,"做了#34;完成后的方法