Custom Segue中的NavigationController.pushViewController不起作用 - Swift 2.0 - iOS 9.1

时间:2015-11-01 18:28:35

标签: uinavigationcontroller swift2 uistoryboardsegue pushviewcontroller presentviewcontroller

我正在UIStoryboardSegue中编写自定义segue。我使用CATransition来创建一个从右到左的自定义动画。如果我使用sourceViewController.navigationController?.pushViewController(destinationViewController, animated: false);,则不会将我带到第二个视图。它只执行从右到左的动画并保持在第一个视图上。我调试了这段代码,发现sourceViewController.navigationController是nil。我在第一个视图和第二个视图之间有一个UINavigationController。

我还尝试用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);
}

非常感谢您的帮助

2 个答案:

答案 0 :(得分:1)

使用sourceViewController.pushViewController是正确的。我sourceViewController.navigationController获得nil的原因是,我将导航控制器放在第一个视图和第二个视图之间。放置导航控制器的正确方法是将其放在第一个视图之前。

This is the correct way of placing the navigation controller:

答案 1 :(得分:0)

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

sourceViewController.navigationController == nil

在SourceViewController的storyboard文件中,单击ViewController,然后:

Editor > Embed in > Navigation controller

然后Xcode生成了三个ViewControllers:一个初始NavigationController,然后是SourceViewController和DestinationViewController。

现在自定义segue工作。

如果这有助于我,请告诉我: - )