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属性的描述中也没有说明不要更改它。