1

私は WYPopoverController を組み込んだアプリに取り組んでおり、本来あるべき場所でうまく機能します。組み込みのプッシュ/ポップではなく、2 つのコントローラー間にカスタム アニメーションを追加したいと考えています。

FROM および TO コントローラーを含むナビゲーション コントローラーでは、WYPopoverController に関連することは何もしません。コントローラーの FROM および TO でも同様です。

実際のアニメーションを処理する非常にシンプルなアニメーター クラスであるナビゲーション コントローラー デリゲートを実装しました。

public class NavigationControllerDelegate: NSObject, UINavigationControllerDelegate {

let animator = Animator()

public func navigationController(navigationController: UINavigationController, animationControllerForOperation operation: UINavigationControllerOperation, fromViewController fromVC: UIViewController, toViewController toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {

    if operation == UINavigationControllerOperation.Pop {
        return self.animator
    }

    return nil
}
}

アニメータークラス:

class Animator: NSObject, UIViewControllerAnimatedTransitioning {

public func transitionDuration(transitionContext: UIViewControllerContextTransitioning) -> NSTimeInterval {
    return 0.33
}

public func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
    let toVC = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)!
    let fromVC = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey)!

    transitionContext.containerView().addSubview(toVC.view)
    toVC.view.alpha = 0

    UIView.animateWithDuration(self.transitionDuration(transitionContext), animations: { () -> Void in
        fromVC.view.transform = CGAffineTransformMakeScale(0.1, 0.1)
        toVC.view.alpha = 1
    }) { (finished) -> Void in
        fromVC.view.transform = CGAffineTransformIdentity
        transitionContext.completeTransition(!transitionContext.transitionWasCancelled())
    }
}  
}

FROM コントローラーで、ナビゲーション デリゲートを初期化します

override public func viewDidLoad() {
    super.viewDidLoad()
    // ... some other code here
    self.navigationController?.delegate = NavigationControllerDelegate()
}

(コレクション)セルをタップしてTOコントローラーに移動したい時点まで、すべてがコンパイルされて実行されます。その時点で、アプリがエラーでクラッシュします: -[CALayer navigationController:animationControllerForOperation:fromViewController:toViewController:]: unrecognized selector sent to instance 0x7fc72e53e970

ブレークポイントを追加し、sizzled_pushViewController:animated:UINavigationController のメソッド内に行き着きました。正直なところ、私はこの問題にどのようにアプローチすればよいかわかりません。

スクリーンショット 2015-05-21 at 15 48 04

4

2 に答える 2

1

結局のところ、ソリューションはまったく関係ありWYPopoverControllerません。どうやら、ルート コントローラー内からナビゲーション コントローラー デリゲートを設定することは、行うべき方法ではありません。前述のライブラリを取り除くためにコードをリファクタリングすることに成功しましたが、まったく同じ例外でクラッシュしていました。

-[CALayer navigationController:animationControllerForOperation:fromViewController:toViewController:]: unrecognized selector sent to instance 0x7fc72e53e970

その時、私は本当に混乱しました。さらに掘り下げて髪を引っ張った後、実用的な解決策が得られました。ストーリーボードでナビゲーション コントローラー デリゲートを初期化すると、すべてのピースが適切な場所に収まりました。

于 2015-05-25T09:46:56.837 に答える
0

WYPopoverControllerメソッド スウィズリングを使用しpushViewController:animatedて、UINavigationController

したがって、基本的にセレクターがそこで呼び出されているのを見ると、メソッドがスウィズルされているため、セレクターが実際に呼び出されて[self sizzled_pushViewController:aViewController animated:aAnimated];いることを意味します。pushViewController:animated

クラッシュに関しては、セレクターnavigationController:animationControllerForOperation:fromViewController:toViewController:が に送信されるのUINavigationControllerではなく、 に送信されているようですがCALayer、もちろんそれに応答せず、アプリがクラッシュします。

なぜこれが起こっているのか、ここで見たものから推測することはできませんが、私が言ったことは、あなたが正しい道に進むことを願っています.

于 2015-05-22T07:48:28.947 に答える