我正在开发一个包含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:
方法中。说实话,我不知道如何处理这个问题。
答案 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
,这当然不响应那和应用程序崩溃。
为什么会发生这种情况我无法从我在这里看到的内容中猜出,但我所说的,希望会让你走上正确的轨道