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

标签 ios swift animation method-swizzling

我正在开发一个包含 WYPopoverController 的应用程序,它在应有的地方工作得很好。我想在两个 Controller 之间添加自定义动画,而不是内置 push/pop。

在包含 FROM 和 TO Controller 的导航 Controller 中,我不做任何与 WYPopoverController 相关的事情,在 FROM 和 TO Controller 中也不做。

我已经实现了导航 Controller 委托(delegate),它非常简单并且是处理实际动画的动画师类。

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 Controller 中我初始化导航委托(delegate)

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

一切都会编译并运行,直到我点击(收集)单元格并想移至 TO Controller 为止。那时应用程序崩溃并出现错误: -[CALayer navigationController:animationControllerForOperation:fromViewController:toViewController:]: 无法识别的选择器发送到实例 0x7fc72e53e970

我添加了一个断点,我最终进入了 UINavigationController 的 sizzled_pushViewController:animated: 方法。老实说,我不知道如何处理这个问题。

screen shot 2015-05-21 at 15 48 04

最佳答案

事实证明,解决方案与 WYPopoverController 无关。显然,从其根 Controller 中设置导航 Controller 委托(delegate)不是它应该完成的方式。我设法重构了我的代码以摆脱上述库,但它仍然因同样的异常而崩溃。

-[CALayer navigationController:animationControllerForOperation:fromViewController:toViewController:]: 无法识别的选择器发送到实例 0x7fc72e53e970

那时我真的很困惑。经过更多的挖掘和拉头发,我得到了可行的解决方案。 我在 Storyboard中初始化了导航 Controller 委托(delegate),所有部分都放在了正确的位置。

关于ios - 在项目中使用 WYPopover 时 UINavigationControllerDelegate 方法调用崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30390524/

相关文章:

ios - 如何通过 AppDelegate 升级使功能可用于大于 8 的 iOS

ios - 计算多个数组的最终值 - swift

ios - 转换为 ARC——解析前向引用

Swift 3,交换两个表格单元格

ios - 我的复合谓词应该如何构造才能包含在内

ios - 没有 setTranslation 奇怪行为的平移手势

swift - 使用后退按钮更改图像 ImageView

css - splinter 的动画

android - OverridePendingTransition,当前 Activity 位于顶部

model-view-controller - MVC中谁负责动画?