2

次のコードでは、ナビゲーション遷移中にカスタムアニメータを作成しようとしていますが、ナビゲーションコントローラのデリゲートメソッドがコールを取得しません。以下のコードを見て、解決策を提案してください。ナビゲーションコントローラのデリゲートメソッドがコールを受けていない

ナビゲーションコントローラにDemoTransitionAnimationViewControllerを埋め込んでいます。このVCには、そのビューにボタンがあります。このビューをクリックすると、別のView Controllerがプッシュされます。しかし、依然としてデリゲートメソッドは呼び出しを取得していません。

CustomAnimator.swift

// 
// CustomAnimator.swift 
// LoginModule 
// 
// Created by Shubham Ojha on 8/14/17. 
// Copyright © 2017 BBI. All rights reserved. 
// 

class FadeInAnimator: NSObject, 
UIViewControllerAnimatedTransitioning { 
    func transitionDuration(
     using transitionContext: UIViewControllerContextTransitioning? 
     ) -> TimeInterval { 
     return 0.35 

    } 
    func animateTransition(using transitionContext: UIViewControllerContextTransitioning) { 
     let containerView = transitionContext.containerView 
     let fromVC = transitionContext.viewController(
      forKey: UITransitionContextViewControllerKey.from) 
     let toVC = transitionContext.viewController(
      forKey: UITransitionContextViewControllerKey.to) 

     containerView.addSubview(toVC!.view) 
     toVC!.view.alpha = 0.0 

     let duration = transitionDuration(using: transitionContext) 
     UIView.animate(withDuration: duration, animations: { 
      toVC!.view.alpha = 1.0 
      toVC?.view.backgroundColor = UIColor.blue 
     }, completion: { finished in 
      let cancelled = transitionContext.transitionWasCancelled 
      transitionContext.completeTransition(!cancelled) 
     }) 
    } 

} 

class NavigationControllerDelegate: NSObject, 
UINavigationControllerDelegate { 

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

     return FadeInAnimator() 

    } 
} 

DemoTransitionAnimationViewController.swift

// 
// DemoTransitionAnimationViewController.swift 
// LoginModule 
// 
// Created by Shubham Ojha on 8/15/17. 
// Copyright © 2017 BBI. All rights reserved. 
// 

import UIKit 

class DemoTransitionAnimationViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     print(self.navigationController ?? "Not exist") 

     if self.navigationController != nil{ 
      self.navigationController?.delegate = NavigationControllerDelegate() 
     // In the above statement if I am setting the delegate as self instead of 
     //NavigationControllerDelegate() and conforming the methods of navigation 
     //controller delegate protocol. It works perfectly. 
     } 
     else{ 
      print("navigation controller does not exist") 
     } 

    } 

} 
+0

NSObjectから継承したクラスNavigationControllerDelegateをUINavigationControllerに変更してみてください。 –

+0

私はそれを試みましたが、まだ電話を受けていません。以下はKrunalの答えですが、私の問題は解決しましたが、なぜ私は現在のコードを呼び出さないのですか?私は私の質問を更新しています。 –

+0

デリゲートは、私の理解に従うと、新しいクラスを割り当てるのではなく、機能を継承させたいクラスを指しているからです。 –

答えて

1

これを試してみてください:

if self.navigationController != nil{ 
    self.navigationController?.delegate = self // Update assignment here 
} 
else { 
    print("navigation controller does not exist") 
} 

self.navigationController?.delegate = NavigationControllerDelegate()をi ndependent(UIViewControllerの参照なし)メモリ割り当て。したがって、View Controllerのデリゲートメソッドの実装には応答しません。

self.navigationController?.delegate = selfは、ナビゲーションコントローラの委任者にビューコントローラのリファレンスDemoTransitionAnimationViewControllerを使用し、ナビゲーションの実装を考慮します。

+0

これは私の問題を解決しましたが、なぜ私は自分の代わりにNavigationControllerDelegate()を使用して呼び出しを取得していません。 –

+0

私の答えについての簡単な説明を追加しました – Krunal

+0

私はそれのリファレンスを作成したとき、それは働いてくれてありがとう。 –

関連する問題