NavigationController.pushViewController在自定义塞格不工作 - 斯威夫特2.0 - iOS 9.1

问题描述:

我正在写UIStoryboardSegue自定义塞格。我使用CATransition来创建一个从左到右自定义动画的权利。如果我使用sourceViewController.navigationController?.pushViewController(destinationViewController, animated: false);,它不会将我带到第二个视图。它仅执行左侧动画的权利并保留在第一个视图上。我调试了这段代码,发现sourceViewController.navigationController为零。在第一个视图和第二个视图之间有一个UINavigationController。NavigationController.pushViewController在自定义塞格不工作 - 斯威夫特2.0 - iOS 9.1

我也尝试用sourceViewController.presentViewController(destinationViewController, animated: false, completion: nil);替换这行代码。过渡确实发生,但发生得太快,我无法看到左侧动画的权利。

我在这个UIStoryboardSegue完整的代码如下:

override func perform() { 


    let sourceViewController = self.sourceViewController as UIViewController; 
    let destinationViewController = self.destinationViewController as UIViewController; 
    let transition: CATransition = CATransition() 

    transition.duration = 0.25; 
    transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) 
    transition.type = kCATransitionPush; 
    transition.subtype = kCATransitionFromRight; 

    sourceViewController.view.layer.addAnimation(transition, forKey: "kCATransition") 

    sourceViewController.navigationController?.pushViewController(destinationViewController, animated: false); 
} 

非常感谢您的帮助

使用sourceViewController.pushViewController是正确的。我之所以没有加入sourceViewController.navigationController是因为我将导航控制器放置在第一视图和第二视图之间。放置导航控制器的正确方法是将其放置在第一个视图之前。

This is the correct way of placing the navigation controller:

+0

这个答案可能是正确的,但很难解释。请填写答案 – voghDev

我也有类似的问题。我的问题是:

sourceViewController.navigationController == nil 

在SourceViewController的故事板文件,单击视图控制器,然后:

Editor > Embed in > Navigation controller 

然后Xcode中产生3个ViewControllers:一个初始NavigationController,然后SourceViewController和DestinationViewController。

现在自定义赛格运作。

让我知道,如果这有助于你:-)