Ios 无法通过编程方式切换回上一个rootViewController

Ios 无法通过编程方式切换回上一个rootViewController,ios,xcode,swift,xcode6,uistoryboard,Ios,Xcode,Swift,Xcode6,Uistoryboard,故事板上有两个视图控制器,我想在某些情况下在它们之间切换,例如,按下按钮,因此我编写了以下代码: // FirstViewController.swift let storyboard = UIStoryboard(name: "Main", bundle: nil) let rootViewController = storyboard.instantiateViewControllerWithIdentifier("SecondViewController") as SecondViewCo

故事板上有两个视图控制器,我想在某些情况下在它们之间切换,例如,按下按钮,因此我编写了以下代码:

// FirstViewController.swift
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let rootViewController = storyboard.instantiateViewControllerWithIdentifier("SecondViewController") as SecondViewController
if let keyWindow = UIApplication.sharedApplication().keyWindow {
    keyWindow.rootViewController = rootViewController
}

// SecondViewController.swift
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let rootViewController = storyboard.instantiateViewControllerWithIdentifier("FirstViewController") as FirstViewController
if let keyWindow = UIApplication.sharedApplication().keyWindow {
    keyWindow.rootViewController = rootViewController
}
从第一个viewcontroller切换到第二个viewcontroller的效果与预期一样,但当我尝试切换回第一个viewcontroller时,它会改变一会儿,但会自动显示第二个viewcontroller,然后再次显示。奇怪的是,如果我将开关代码更改为

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let rootViewController = storyboard.instantiateViewControllerWithIdentifier("SecondViewController") as SecondViewController
self.presentViewController(rootViewController, animated: true, completion: nil)
它按预期工作

为什么??我做错了什么?我怎样才能修好它


提前感谢。

您可以通过创建基本导航控制器并将其用作切换器来执行类似操作,而不是更改窗口的rootViewController:

class BaseViewController: UINavigationController {

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder);

        // You can skip this step if you instantiate BaseViewController in a
        // storyboard and set its root segue to FirstViewController
        self.viewControllers = [FirstViewController(nibName:"FirstViewController", bundle:nil)]
    }

    override func pushViewController(viewController: UIViewController, animated: Bool) {
        self.viewControllers = [viewController]
    }
}


class FirstViewController: UIViewController {

    required init(coder aDecoder: NSCoder) {
        super.init(nibName: "FirstViewController", bundle: nil)
    }

    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
    }

    @IBAction func goToSecond(sender: AnyObject) {
        self.navigationController?.pushViewController(SecondViewController(nibName:"SecondViewController", bundle:nil), animated: true);   
    }
}


class SecondViewController: UIViewController {

    required init(coder aDecoder: NSCoder) {
        super.init(nibName: "SecondViewController", bundle: nil)        
    }

    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
    }

    @IBAction func goToFirst(sender: AnyObject) {
        self.navigationController?.pushViewController(FirstViewController(nibName:"FirstViewController", bundle:nil), animated: true);    
    }
}

这里,我从nibs加载视图控制器。但是,您可以很容易地从故事板中实例化它们,就像您在示例中所做的那样。此外,您还可以隐藏导航栏,使其看起来不像导航上下文。

为什么只更改根视图控制器而不进行模式演示或推送?当您返回到第一个控制器时,是否要返回到您来自的同一实例,因为您的代码没有这样做,它正在创建一个新实例?@rdelmar因为我认为这是更改视图控制器程序的更合适的方法。没有理由使用此代码自动转到第一个控制器,除非您要转到第一个控制器的ViewDid中的第二个控制器。在第一次分配UIWindow的rootViewController属性后,不应触摸它。相反,你必须想出一些其他的方式来表达它。就像视图控制器演示文稿或管理其子对象的容器UIViewController一样。@mstysf,为什么您认为不应该触摸根视图控制器?我在苹果的文档中没有看到任何东西说你不应该这样做。事实上,在UIWindow类的顶部,它说:要更改应用程序显示的内容,可以更改窗口的根视图;rootViewController属性的描述中也没有说明不要更改它。