ios - UINavigationControllerDelegate 不起作用

标签 ios swift uinavigationcontroller

更新到正确的版本,因为得到了答案。

我想在导航 View Controller 弹出/推送时做淡入/淡出动画,然后我实现一个 BaseViewController:

class BaseViewController: UIViewController, UINavigationControllerDelegate {

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        self.navigationController?.delegate = self
    }


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

        if (operation == UINavigationControllerOperation.Push) {
            return FadeInAnimator()
        }

        if (operation == UINavigationControllerOperation.Pop) {
            return FadeOutAnimator()
        }
        return nil;
    }
}

FadeInAnimatorFadeOutAnimator:

class FadeInAnimator: NSObject, UIViewControllerAnimatedTransitioning {

    func transitionDuration(transitionContext: UIViewControllerContextTransitioning?) -> NSTimeInterval {
        return 0.5
    }

    func animateTransition(transitionContext: UIViewControllerContextTransitioning) {

        let toViewController = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)
        transitionContext.containerView()?.addSubview(toViewController!.view)
        toViewController?.view.alpha = 0.0
        UIView.animateWithDuration(self.transitionDuration(transitionContext), animations: { () -> Void in
            toViewController?.view.alpha = 1.0
        }) { (finished) -> Void in
            transitionContext.completeTransition(!transitionContext.transitionWasCancelled())
        }
    }
}

class FadeOutAnimator: NSObject, UIViewControllerAnimatedTransitioning {
    func transitionDuration(transitionContext: UIViewControllerContextTransitioning?) -> NSTimeInterval {
        return 0.5
    }

    func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
        let toViewController = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)
        let fromViewController = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey)
        transitionContext.containerView()?.insertSubview((toViewController?.view)!, belowSubview: (fromViewController?.view)!)

        UIView.animateWithDuration(self.transitionDuration(transitionContext), animations: { () -> Void in
            fromViewController?.view.alpha = 0.0
        }) { (finished) -> Void in
            transitionContext.completeTransition(!transitionContext.transitionWasCancelled())
    }
}

然后,我添加了 2 个 View Controller 并嵌入了导航 View Controller ,ViewControllerAViewControllerB:

class ViewControllerA: BaseViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func pressButton(sender: UIButton) {

        if let vc = create(ViewControllerB) {
            self.navigationController?.pushViewController(vc, animated: true)
        }
    }  
}

class ViewControllerB: BaseViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

    }
}

ViewControllerA 上按下按钮将创建并跳转到 ViewControllerB,然后在 ViewControllerB 上按下导航栏项“返回”将返回到 ViewControllerA.

但它不起作用,当按下按钮时,ViewControllerA 显示 ViewControllerB,然后再次显示 ViewControllerA

有什么建议吗?我的 xcode 是 7.1 并在 iPad Air 2 模拟器上运行。

最佳答案

在 FadeInAnimator 的动画完成 block 中

改变这个

transitionContext.completeTransition(transitionContext.transitionWasCancelled())

transitionContext.completeTransition(!transitionContext.transitionWasCancelled())

关于ios - UINavigationControllerDelegate 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33359774/

相关文章:

ios - 如何制作褪色的导航栏

swift - Xcode 项目文件夹结构

ios - 我在从导航堆栈中删除 ViewController 时遇到问题?

ios - 如何使用 Swift 使文本字段的文本成为下一个导航 Controller 的标题?

ios - 在 iOS 中将 NSMutableDictionary 添加到 NSMutableArray 时崩溃?

iphone - 在内存警告消失后如何从 XIB 重新加载 UIViewController 的 View ?

iOS(swift) 如何从数据库中获取数据

ios - Sprite Kit 声音问题,如何防止停止用户声音

ios - UIAlertController:添加 subview

iphone - navigationItem.backBarButtonItem 不工作?为什么以前的菜单仍然显示为按钮?