如何将UINavigationControllerDelegate连接到导航控制器?

问题描述:

解答:简单的语法错误 - 设定委托时,应该读SomeNavigationController.delegate =自,不SomeNavigationController.navigationController .delegate =自如何将UINavigationControllerDelegate连接到导航控制器?

下面是其中创建导航控制器的基本视图控制器?。我将自己声明为它的委托,并且在该视图控制器的扩展中符合委托的协议,并创建一个对象作为自定义动画。但是此导航堆栈中的视图控制器不采用此动画;我错过了什么?

是否需要在此导航堆栈的根视图控制器中存在任何代码,或者在此堆栈中正在推送和弹出的视图控制器中是否存在任何代码?或者所有的自定义动画代码都属于这里(在创建导航控制器的视图控制器中),我只是错过了一些东西?


视图控制器,其中的UINavigationController创建

class BaseViewController: UIViewController { 

    override func loadView() { 
     buildNavigationController() 
    } 

    func buildNavigationController() { 
     let SomeNavigationControllerRoot = SomeViewController() 
     let SomeNavigationController = UINavigationController(rootViewController: SomeNavigationControllerRoot) 
     SomeNavigationController.delegate = self 
     view.addSubview(SomeNavigationController.view) 
    } 

} 

extension BaseViewController: UINavigationControllerDelegate { 

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

} 

class CustomAnimator: NSObject, UIViewControllerAnimatedTransitioning { 

    func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval { 
     return 1.0 
    } 


    func animateTransition(using transitionContext: UIViewControllerContextTransitioning) { 

     let containerView = transitionContext.containerView 
     let toViewController = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.to) 

     containerView.addSubview(toViewController!.view) 

     toViewController!.view.alpha = 0.0 

     UIView.animate(withDuration: 1.0, animations: { 
      toViewController!.view.alpha = 1.0 
     }, completion: { finished in 
      let cancelled = transitionContext.transitionWasCancelled 
      transitionContext.completeTransition(!cancelled) 
     }) 

    } 

} 



根视图控制器中的UINavigationController栈

class SomeViewController: UIViewController, UINavigationControllerDelegate { 

    func pushToNext() { 
     let randomViewController = randomViewController() 
     navigationController?.pushViewController(randomViewController, animated: true) 
    } 

} 
+0

我想代替委托设置过渡委托。 toViewController.transitioningDelegate = self。 –

如果你想使用自定义的转换则需要申请transitioningDelegate 将视图控制器的transitioningDelegate设置为您的自定义类并返回自定义动画控制器。