不调用委托方法(transitioningDelegate)

时间:2016-10-05 14:10:24

标签: ios swift

我正在尝试在两个viewControllers之间实现自定义转换。 ( Swift 3.0

在我的两个viewControllers之间,我有UISegueshowanimated = true)。

所以我在第一个视图控制器的扩展中设置了UIViewControllerTransitioningDelegate的委托方法:

extension DocumentsViewController : UIViewControllerTransitioningDelegate { ... }

我还通过协议实现了所需的方法:

animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
     ...
}

public func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
     ...
}

现在执行segue时,在firstViewController我使用委托方法prepareForSegue最终将transitioningDelegate设置为我的`secondViewController,请参阅下文:

public override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    super.prepare(for: segue, sender: sender)
    if let destination = segue.destination as? DocumentDetailViewController {
        destination.transitioningDelegate = self
    }
}

我检查了断点,委托已经设置好了我的firstViewController。 但是我的firstViewController中transitioningDelegate的委托方法永远不会被触发,我不知道为什么。

有什么想法吗?

PS:在我的故事板中,我的segue have Animated to true,所以这应该有效,但事实并非如此。

感谢。

已解决: MadreDeDios,Matt和Tushar的混合答案。

1:由于我想在我的应用中保留导航,因此我必须将第一个viewController符合UINavigationControllerDelegate而不是UIViewControllerTransitioningDelegate。 (参见 MadreDeDios回答)。

2:根据此协议,我实现了以下委托方法:

public func navigationController(_ navigationController: UINavigationController, animationControllerFor operation: UINavigationControllerOperation, from fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {

...

}

3:我之前在viewDidLoad()的{​​{1}}处设置了代理人(请参阅马特的回答):

firstViewController

4:我正在使用手动推送而不是segue来显示我的override public func viewDidLoad() { super.viewDidLoad() //... self.navigationController?.delegate = self } (请参阅 Tushar的回答

现在这个有效,谢谢。

3 个答案:

答案 0 :(得分:6)

因为您正在使用push segue,我假设您也在使用导航控制器。

当您使用UINavigationController时,它将成为每个转场,动画甚至应用程序方向的参考。

我的建议是使用导航控制器作为所有动画的管理器。您需要做的就是添加以下几点:

extension MyNavigationController: UINavigationControllerDelegate {

     func navigationController(_ navigationController: UINavigationController, animationControllerFor operation: UINavigationControllerOperation, from fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        //Check for the good animation
        return MyAnimation()
    }
}

MyNavigationController班级

override func viewDidLoad() {
    super.viewDidLoad()

    //This is the key
    self.delegate = self

    //Only if you want to animate the presentation of your navigation controller itself, the first time it appears:
    self.transitioningDelegate = self
}

答案 1 :(得分:5)

问题是你设置transitioningDelegate为时已晚。 方式为时已晚。它需要在视图控制器的生命周期的早期设置 very 。我建议在视图控制器的初始化程序中设置此属性。

答案 2 :(得分:1)

尝试删除故事板的转换并手动执行视图显示代码,并明确提及动画参数的“true”:

presentViewController(documentVC,animated:true,completion:nil)