如何返回Swift中的初始视图控制器?

如何返回Swift中的初始视图控制器?,swift,uinavigationcontroller,pushviewcontroller,Swift,Uinavigationcontroller,Pushviewcontroller,所以我有一个登录视图,成功登录后,它会进入导航控制器的第一个视图,然后用户可以深入到设置视图,然后进入注销视图。此注销应将用户带回登录视图(该视图不是导航控制器的一部分)。它适用于以下代码: let loginViewController = self.storyboard!.instantiateViewControllerWithIdentifier("Login") as? LoginViewController self.navigationController!.pushViewCon

所以我有一个登录视图,成功登录后,它会进入导航控制器的第一个视图,然后用户可以深入到设置视图,然后进入注销视图。此注销应将用户带回登录视图(该视图不是导航控制器的一部分)。它适用于以下代码:

let loginViewController = self.storyboard!.instantiateViewControllerWithIdentifier("Login") as? LoginViewController
self.navigationController!.pushViewController(loginViewController!, animated: true)

但是登录视图在顶部显示导航栏,它不应该这样做,可能除了
self.navigationController!。按下我应该使用的ViewController?

我建议您从一个ViewController切换到另一个,而不是像那样按下ViewController

因此,首先,需要从第一个ViewController到登录的ViewController按Ctrl+clic组合键,然后在属性检查器中为其指定一个标识符

那么,你所要做的就是:

    self.performSegueWithIdentifier("yourIdentifier", sender: self)

现在,对于导航栏,我建议您从登录视图中删除导航控制器,并将其与第一个视图相关联。它将从您的登录视图中删除导航栏。

如果您正在使用故事板,请查看“展开”分段

您只需在控制器中创建要导航到的“展开”选项:

@IBAction func unwindToMe(segue: UIStoryboardSegue){}
然后从故事板创建segue

当您需要返回时,只需使用刚刚创建的展开序列标识符调用
performsgue
方法

如果您只想从代码中执行,那么您可以编写如下内容:

let loginViewController = self.storyboard?.instantiateViewControllerWithIdentifier("Login")
UIApplication.sharedApplication().keyWindow?.rootViewController = loginViewController

在这种情况下,您将把应用程序设置为初始状态。

SWIFT:您应该使用一个展开序列

  • 首先,在
    FirstViewController
    中放入以下行:

    @IBAction func prepareForUnwind(segue: UIStoryboardSegue) { } Swift 4

    self.performSegue(withIdentifier: "unwindToViewController1", sender: self) self.performsgue(标识符为“unwindToViewController1”,发送方为self)

  • 如果您有导航控制器,请从控制器使用:

    self.navigationController?.popToRootViewControllerAnimated(true)
    
    试试看

    这将使您回到应用程序流程的开始

    更新至Swift 4(感谢@javaBeast)

    是转到导航控制器的第一个控制器的最佳选项
    然后关闭导航控制器

    就像一个魔咒,然后你非常much@matt第二种变体更适合使用。它更加自信,而且你不是从故事板上创建控制器。这绝对是第一次完美无瑕的最佳答案,这在开发人员的生活中是非常罕见的。这个答案对Xcode 8和Swift 3仍然有效。效果很好!谢谢你的完美!我仍然困在这个问题上。。。当用户登录时,如何解决此问题,然后在NSUserdefaults中设置一个令牌,这样他就不必再次登录,将来某个时候他会决定注销?当我尝试这种方法时,“登录”屏幕不再在控制器堆栈中,因为我在应用程序启动时跳过了这个屏幕,所以我无法打开登录屏幕。请帮忙!我不相信这和他想做的事有什么关系。。。因为如果您使用Identifier执行GuegueWithIdentifier,您将向窗口堆栈添加一个新窗口。。。不返回到第一个视图控制器。。最好的答案是由Allan提供的答案简单、准确、最好肯定是最好和最简单的答案。在swift 4中,使用self.navigationController?.popToRootViewController(动画:true)对我来说效果很好,因为我有3个不同的视图,在这之间我有2个导航控制器。在找到10个对我不起作用的其他解决方案后,这一个终于起作用了,谢谢!为SWIFT 4更新:
    self.view.window?.rootViewController?.disclose(动画:true,完成:nil)
    这是我在SWIFT 5中唯一有效的解决方案。非常感谢你!
    self.navigationController?.popToRootViewControllerAnimated(true)
    
        self.view.window?.rootViewController?.dismissViewControllerAnimated(true, completion: nil)
    
        self.view.window?.rootViewController?.dismiss(animated: true, completion: nil) 
    
    self.navigationController?.popToRootViewController(animated: true)