在项目中使用WYPopover时,UINavigationControllerDelegate方法调用崩溃

时间:2015-05-22 07:14:00

标签: ios swift animation method-swizzling

我正在开发一个包含WYPopoverController的应用程序,它可以在适当的位置使用。我想在两个控制器之间添加自定义动画,而不是内置push / pop。

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

Animator类:

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:]:无法识别的选择器发送到实例0x7fc72e53e970

我添加了断点,最后在UINavigationController的sizzled_pushViewController:animated:方法中。说实话,我不知道如何处理这个问题。

screen shot 2015-05-21 at 15 48 04

2 个答案:

答案 0 :(得分:1)

事实证明,解决方案与WYPopoverController无关。显然从根控制器中设置导航控制器委托不是应该完成的方式。我设法重构我的代码以摆脱前面提到的库,但它仍然崩溃了同样的异常。

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

那时我真的很困惑。经过一些挖掘和拔毛后我得到了解决方案。 我在故事板中初始化了导航控制器委托,所有部分都落到了正确的位置。

答案 1 :(得分:0)

WYPopoverController正在使用Method Swizzling来调动pushViewController:animated的{​​{1}}

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

现在关于您的崩溃,似乎不是将选择器pushViewController:animated发送到navigationController:animationControllerForOperation:fromViewController:toViewController:,而是将其发送到UINavigationController,这当然不响应那和应用程序崩溃。

为什么会发生这种情况我无法从我在这里看到的内容中猜出,但我所说的,希望会让你走上正确的轨道