【问题标题】:How can I go back to the initial view controller in Swift?如何回到 Swift 中的初始视图控制器?
【发布时间】:2015-07-15 03:56:42
【问题描述】:

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

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

但是登录视图在顶部显示导航栏,它不应该这样做,也许我应该使用除self.navigationController!.pushViewController之外的其他东西?

【问题讨论】:

    标签: swift uinavigationcontroller pushviewcontroller


    【解决方案1】:
    self.navigationController?.popToRootViewController(animated: true)
    

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

    【讨论】:

      【解决方案2】:

      试试看

          self.view.window?.rootViewController?.dismissViewControllerAnimated(true, completion: nil)
      

      这将使您回到申请流程的开始。

      更新到 Swift 4(感谢 @javaBeast)

          self.view.window?.rootViewController?.dismiss(animated: true, completion: nil) 
      

      【讨论】:

      • 非常适合我,因为我有 3 个不同的视图,中间有 2 个导航控制器
      • 在找到其他 10 个对我不起作用的解决方案后,这个终于解决了,谢谢!为 SWIFT 4 更新:self.view.window?.rootViewController?.dismiss(animated: true, completion: nil)
      • 在 SWIFT 5 中唯一对我有用的解决方案。非常感谢!
      【解决方案3】:

      SWIFT:您应该使用 unwind segue。

      1. 首先,将以下行放入您的FirstViewController

        @IBAction func prepareForUnwind(segue: UIStoryboardSegue) { }

        该函数实际上没有任何代码。


      1. 现在,转到您的故事板并通过控制从黄色按钮拖动到退出按钮来为LogoutViewController 创建一个展开转场。像这样:

      1. 选择为FirstViewController创建的展开转场。

      2. 更改转场标识符:


      1. 进入LogoutViewController的代码,正常调用unwind segue即可:

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

        斯威夫特 4

        self.performSegue(withIdentifier:“unwindToViewController1”,发件人:self)

      【讨论】:

      • 这绝对是最好的答案
      • 第一次完美地工作,这在开发人员的生活中是非常罕见的。这个答案对 Xcode 8 和 Swift 3 仍然有效。
      • 像魅力一样工作!非常感谢
      • 完美的蒙多!
      • 我仍然陷入这个问题......当用户登录时你如何解决这个问题,然后你在 NSUserdefaults 中设置一个令牌,这样他就不必再次登录了他决定退出?当我尝试这种方法时,“登录”屏幕不再出现在控制器堆栈中,因为我在应用程序启动时跳过了这个屏幕,所以我无法放松到登录屏幕。请帮忙!
      【解决方案4】:

      如果您正在使用情节提要,请查看 unwind segueing。

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

      @IBAction func unwindToMe(segue: UIStoryboardSegue){}
      

      然后从情节提要创建转场。

      当您需要返回时,只需使用您刚刚创建的展开转场标识符调用 performSegue 方法。

      如果你只想通过代码来做,那么你可以写这样的东西:

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

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

      【讨论】:

      • 工作就像一个魅力,那么你非常
      • @matt 第二个变种更好用。它更加自信,并且您不是从情节提要创建控制器。
      【解决方案5】:

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

      self.navigationController?.popToRootViewControllerAnimated(true)
      

      【讨论】:

      • 简单、准确、最好
      • 绝对是最好和最简单的答案。
      • 在 swift 4 中,使用 self.navigationController?.popToRootViewController(animated: true)
      【解决方案6】:

      我建议您从一个 ViewController 到另一个 ViewController 进行转场,而不是像那样推送您的 ViewController。

      所以首先,你需要从你的第一个 ViewController 到你的登录 ViewController,然后在属性检查器中给它一个标识符。

      那么,你所要做的就是:

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

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

      【讨论】:

      • 我不相信这适用于他正在尝试做的事情......因为如果你执行SegueWithIdentifier,你正在向窗口堆栈添加一个新窗口......而不是返回到第一个视图控制器..最好的答案是艾伦提供的答案
      猜你喜欢
      • 2018-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-01
      • 1970-01-01
      相关资源
      最近更新 更多