1

我正在开发一个包含 WYPopoverController 的应用程序,它在应该的地方工作得很好。我想在两个控制器之间添加自定义动画,而不是内置推送/弹出。

在包含 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 在 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

正在使用WYPopoverControllerMethod Swizzling 来pushViewController:animatedSwizzleUINavigationController

所以基本上当你看到[self sizzled_pushViewController:aViewController animated:aAnimated];选择器在那里被调用时,这意味着你的pushViewController:animated选择器实际上被调用了,因为方法已经被调配了。

现在关于您的崩溃,似乎选择器不是navigationController:animationControllerForOperation:fromViewController:toViewController:被发送到UINavigationController,而是被发送到CALayer,这当然不会响应并且应用程序崩溃。

为什么会这样

于 2015-05-22T07:48:28.947 回答